4
class B;

class A{

    B *b;
    public:
    void operator= (B *b){
        this->b = b;
    }
}; 

B *b = new B()
A *a = new A();
a = b;

「変換できません」というエラーが表示B*されます。A*これを回避する方法はありますか?

さて、方法があり、私が次のようなものを使用する場合:

a = NULL;

どの演算子「=」が使用されますか?

4

3 に答える 3

8

オブジェクトの代わりにポインタを割り当てました。最後の命令を次のように置き換えるだけです。 *a = b;

2番目の質問に答えるには:NULLは、コンパイラーで複数の方法で定義できます(最新の標準では、積分0またはリテラルとしてnullptr)。ポインターを他のタイプのポインターにキャストすることもできますが、またはvoid*をとるオーバーロードされた関数にaを渡すと、コンパイラーは呼び出されている関数を解決できなくなる可能性があります。int*long*

ただし、NULLを避けたい場合は、operator(B& b)代わりに単に作成してください。参照は必ずオブジェクトを指しています。

于 2012-09-10T20:56:23.283 に答える
5

からへの割り当てoperator=を提供します。あなたのコードは(エラーメッセージが示すように)からへの変換を提供しません。そのため、はポインタであり、ではないため、指定した代入演算子は使用しません。コードでは、のように、からへの割り当てが可能です。B*AB*A*a=NULLaAB*AA a= new B();

ポインタの代わりに実際のオブジェクトを使用する場合は*、コードからすべてを削除してください。

class B{};    
class A{    
    B b;
    public:
    void operator= (const B& b){ //pass non-primitives by const reference
        this->b = b;
    }
}; 

B b;
A a;
a = b;

ポインタを使用したい場合、aB*をに割り当てる唯一の「便利な」方法A*は、Bオブジェクトが。から派生した場合Aです。それはあなたがしていることではないように見えるので、にを割り当てることB*A*あなたのコードでは意味がありません。

于 2012-09-10T20:59:41.837 に答える
2

に割り当てるステートメントを次のように変更します。

*a = b;
于 2012-09-10T20:56:44.777 に答える