グローバルに宣言されたクラスAへの2つのポインタがあります
A* a;
A* b;
int main(){
a = new A(...);
}
コピーコンストラクターを呼び出して、bをaのcopyBYVALUEとして作成するにはどうすればよいですか。クラスAには、フィールドとしてのポインタはありません。
コンストラクターが宣言されていますが、デフォルトのコンストラクターをオーバーライドしないように、コンストラクターを削除できます。
ありがとう
グローバルに宣言されたクラスAへの2つのポインタがあります
A* a;
A* b;
int main(){
a = new A(...);
}
コピーコンストラクターを呼び出して、bをaのcopyBYVALUEとして作成するにはどうすればよいですか。クラスAには、フィールドとしてのポインタはありません。
コンストラクターが宣言されていますが、デフォルトのコンストラクターをオーバーライドしないように、コンストラクターを削除できます。
ありがとう
コードには2つの問題があり、質問に答える前に修正する必要があります。
unique_ptr
または単なるオブジェクトを使用します(オブジェクトがより長く存続することになっている場合を除きますがmain()
、それは奇妙なケース)。したがって、コードを修正すると、次のようになります。
int main()
{
A a;
A b(a);
}
コードの他の部分からこれらのオブジェクトに明示的に渡すことなくアクセスする必要がある場合は、適切な名前を付けてnamespace
ください。
// in header
namespace a_and_b // this is *wrong* name for it, of course
{
extern A a;
extern A b;
}
// in one of TUs - also possible to wrap this in namespace ... { ... }
A a_and_b::a;
A a_and_b::b(a_and_b::a);
もちろん、構文を求めているだけの場合、答えは次のようになります。
A * b = new A(*a);
したがって、ポインタを逆参照してからA
抜け出しA *
ます。ただし、これは絶対に行わないでください。自立型の環境でも、独自のスマートポインターを簡単に実装して、これを適切な方法でラップできます。
newを使用してコピーコンストラクターを呼び出すだけです。
b = new A(*a);
しかし、私は尋ねなければなりません...代わりに2つの静的オブジェクトを保持しませんか?
宣言しない場合は、常に暗黙のコンストラクター、コピーコンストラクター、およびStoryTellerが言ったように呼び出すことができるデストラクタを取得します。
b = new A(*a);
コピーコンストラクターで何かをしたい場合は、それを書く必要があります。その方法について少し説明します:http ://www.cplusplus.com/articles/y8hv0pDG/