1

グローバルに宣言されたクラスAへの2つのポインタがあります

A* a;
A* b;

int main(){
     a = new A(...);           
}

コピーコンストラクターを呼び出して、bをaのcopyBYVALUEとして作成するにはどうすればよいですか。クラスAには、フィールドとしてのポインタはありません。

コンストラクターが宣言されていますが、デフォルトのコンストラクターをオーバーライドしないように、コンストラクターを削除できます。

ありがとう

4

3 に答える 3

4

コードには2つの問題があり、質問に答える前に修正する必要があります。

  1. それらのグローバルポインタがグローバルであるという事実-グローバル名前空間でグローバルなものを持っていることは、悪いデザインの兆候です(あなたの先生がそれを提唱している場合-それは宿題のように見えるので-そしてそうするために彼を平手打ちします)。
  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 *ます。ただし、これは絶対に行わないでください。自立型の環境でも、独自のスマートポインターを簡単に実装して、これを適切な方法でラップできます。

于 2013-01-09T13:07:22.240 に答える
3

newを使用してコピーコンストラクターを呼び出すだけです。

b = new A(*a);

しかし、私は尋ねなければなりません...代わりに2つの静的オブジェクトを保持しませんか?

于 2013-01-09T13:01:07.653 に答える
1

宣言しない場合は、常に暗黙のコンストラクター、コピーコンストラクター、およびStoryTellerが言ったように呼び出すことができるデストラクタを取得します。

b = new A(*a);

コピーコンストラクターで何かをしたい場合は、それを書く必要があります。その方法について少し説明します:http ://www.cplusplus.com/articles/y8hv0pDG/

于 2013-01-09T13:06:55.107 に答える