合計 昨日 今日

[C++] 代入演算子のオーバーロードの書き方で使う場面がわからないものがあります。

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: OPE
[URL]
Date: 2017年9月13日(水) 13:39
No: 1
(OFFLINE)

 [C++] 代入演算子のオーバーロードの書き方で使う場面がわからないものがあります。

お世話になっております。

C++のオペレータオーバーロードにおいて、とあるクラスAに対し、

コード[C++]: 全て選択
1
2
3
void operator = (A* pA) {
    //処理
}


このように書いた時のオペレータはどこでどのように使用すると適用されるのかわかりません。
教えて頂けると幸いです。

以下にサンプルコードを示します。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 
using std::cin;
using std::cout;
using std::endl;
 
/* int値を1つ保持するだけのクラス */
class A {
private:
    //値の保持
    int m_val;
 
public:
    //コンストラクタ
    A(int val = 0) { m_val = val; }
    //デストラクタ
    ~A() {}
    //値の取得
    int GetVal() { return m_val; }
 
public:
    /* 使い方がわからないオペレータ */
    void operator = (A* pA) {
        m_val = pA->m_val;
    }
};
 
/* メイン関数 */
int main() {
    A* a1 = new A(1);
    A* a2 = new A(2);
 
    cout << a1->GetVal() << endl;
    cout << a2->GetVal() << endl;
 
    delete a1;
    delete a2;
 
    return 0;
}

Name: OPE
[URL]
Date: 2017年9月13日(水) 14:48
No: 2
(OFFLINE)

 Re: [C++] 代入演算子のオーバーロードの書き方で使う場面がわからないものがあります。

補足です。

ちなみにこの記述は以下にありました。大分お世話になっています。
http://marupeke296.com/DXCLS_Impliment_Com_ptr.html

ついでに疑問ですが、
上のURLのページでは比較演算子のオーバーロード(テンプレート型のポインタの比較)もありますが、ポインタをintにキャストして比較という方法は一般的なのでしょうか。
T*型だろうと、同じポインタを示していればintキャスト後も同じ値になるということで別に問題にはならないのですかね。

Name: usao
[URL]
ハッカー(136,740 ポイント)
Date: 2017年9月13日(水) 14:54
No: 3
(OFFLINE)

 Re: [C++] 代入演算子のオーバーロードの書き方で使う場面がわからないものがあります。

定義した通りの引数型になる形で書けば使われるんじゃないでしょうか.
コード[C++]: 全て選択
1
2
3
4
A a1(5);
A a2(3);
 
a1 = &a2;  //こうかな

Name: OPE
[URL]
Date: 2017年9月14日(木) 05:19
No: 4
(OFFLINE)

 Re: [C++] 代入演算子のオーバーロードの書き方で使う場面がわからないものがあります。

[解決!]

回答ありがとうございます。

すみません根本的に勘違いしていました。
別に特別な書き方をしているわけではなく、他のオペレータの書き方と同じですね。

張ったURLでは、よく見ると自身のクラスのアドレスを引数にとっているわけではありませんでした。単にそのメンバ変数に直接値を代入したいだけでした。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
/* int値を1つ保持するだけのクラス */
class A {
private:
    //値の保持
    int m_val;
 
public:
    //コンストラクタ
    A(int val = 0) { m_val = val; }
    //デストラクタ
    ~A() {}
    //値の取得
    int GetVal() { return m_val; }
 
public:
    /* 値を登録するためのオペレータでした */
    void operator = (int val) {
        m_val = val;
    }
};
 
/* メイン関数 */
int main() {
    A a1(1); //初期化
    std::cout << a1.GetVal() << std::endl;
 
    a1 = 3; //新しい値を登録
    std::cout << a1.GetVal() << std::endl;
 
    return 0;
}


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[9人]