2

ポインタthisを初期化するために使用するクラスがあります。void*しかし、問題は、そのクラスのインスタンスをで渡すと、ポインターがスタック上の新しいアドレスに変更されないことです。そこで、コピーコンストラクターをオーバーライドして、ポインターを新しいアドレスの。に再割り当てすることを考えましたthis。しかし、私は通常コンストラクターパラメーターによって取得するスーパークラスコンストラクターを呼び出すための変数が必要ですが、コピーコンストラクターにはそれらがありません...

私はよく説明したと思います...

したがって、問題は次のとおりです。ポインタの再割り当ての部分を追加するデフォルトのコピーコンストラクタの手順を維持できますか?または、より良い選択肢はありますか?

ありがとう

ここにいくつかのコードがあります:

class GetsCopiedByValue : public SuperClass
{
    GetsCopiedByValue(Type1 *t1, Type2 *t2, float var1, /* A lot of other things I need */) :
         SuperClass(t1, t2), var1(var1)
    {
         t1->set_GetsCopiedByValue_Address(this);  // ***
    }
}

何処か別の場所:

{
    GetsCopiedByValue instance (t1, t2, 4.64, /* All the other things */);
    SomeType *t = new SomeType(instance); // <-- here, it gets copied by value,
}  // but the original "instance" goes (here) out of scope and the address 
   // I assigned (***) is not longer valid, so I have to
   // reassign the address to the new address, after copying it.
4

2 に答える 2

2

これが役立つかどうかはわかりませんが、実際には、コピーコンストラクターでスーパークラスのコピーコンストラクターを呼び出すことができます。

GetsCopiedByValue(GetsCopiedByValue const& other) :
     SuperClass(other), var1(other.var1)
{
     t1->set_GetsCopiedByValue_Address(this);
}

ただし、この基本クラスのコンストラクター呼び出しを省略しても、C++によって挿入されると思います。

于 2010-08-07T15:43:07.533 に答える
0

最初にオブジェクトを作成するときにパラメーターを保存し(おそらくスーパークラスで使用しているため)、コピーの作成時にパラメーターを再度使用する必要があります。つまり、コピー元のオブジェクトからパラメーターを読み戻します。

編集

さらに良いことに、@ Konrad Rudoplhが提案しているように実行し、基本クラスのコピーコンストラクターも定義して使用します。

于 2010-08-07T15:35:31.210 に答える