7

おはようございます。共有プロジェクトで C++ のオブジェクトを使用した深いコピーと浅いコピーの背後にあるロジックを理解するのに問題があるため、次の例を作成しました。

int main() {
    ObjectAType* objecta = ObjectAType::New();
    ObjectBType* objectb = ObjectBType::New();

    // some operation to populate data members of object a
    objecta->Operation();

    // assume I have accessors to return datamembers of object a
    // I wish to make a deep copy of SOME of those data members into object b
    objectb->AlignWithA(objecta);

    objecta->Delete();
    objectb->Delete();

    return 0;
}

次に、オブジェクト b クラス関数を次のように指定します。

public:
void ObjectBType::AlignWithA(ObjectAType* objecta) {
    this->ObjectBDataMember = objecta->DataAccessor();
}
protected:
int ObjectBDataMember;

データ アクセサーは、クラス定義内で次のようなものです。

public:
int ObjectAType::DataAccessor() {
    return this->ObjectADataMember;
}
protected:
int ObjectADataMember;

結果としていくつかの質問があります。

1) オブジェクト b では、データ メンバーが次のように宣言されているため、

int ObjectBDataMember; 

としてではなく

int *ObjectBDataMember;

なぜデータメンバーは次のようにアクセスされるのですか

this->ObjectBDataMember

としてではなく

this.ObjectBDataMember

?

2) これは深いコピーですか、それとも浅いコピーですか?

重要な部分が抜けていたら申し訳ありません。私はあまりプログラマーではないので、このようなことには簡単に混乱してしまいます。文学は私をさらに混乱させました。お時間をいただきありがとうございます。

4

5 に答える 5

7
  1. C ++では、this現在のオブジェクトへの(変更不可能な)ポインターとして定義されます。そのため、にアクセスするために使用this->aMemberしますaMember。これは、持っているタイプとは無関係ですaMember。(注:同じ名前を使用するローカル変数または関数パラメーターがない限り、this->aMember使用することは単に使用することと同じです)。aMember

  2. はintであるためObjectBDataMember、それをコピーすることは、浅いまたは深いとは呼ばれません。これらの概念は、ポインターをコピーする場合にのみ使用されます。

例えば:

ObjectBType* b1 = new ObjectBType();

ObjectBType* b2 = b1; // shallow copy. b1 and b2 refer to the same object.
ObjectBType* b3 = new ObjectBType(*b1); /* deep copy. b1 and b3 refer to 
  different objects that happen to have the same value. */
于 2013-01-16T18:13:40.027 に答える
4

this->ObjectBDataMember「データメンバーがとしてではなくとしてアクセスされるのはなぜthis.ObjectBDataMemberですか?」

これthisは、がポインターであり、->オペレーターがその前にあるポインターをたどって、その後にあるメンバーにアクセスするためです。

「これは深いコピーですか、それとも浅いコピーですか?」

整数変数のコピーを意味する場合、それを浅いコピーと呼ぶことができますがint、データ構造ではないため、そのように修飾する必要はありません。

「ディープコピー」という用語は、コピーされるオブジェクトに関連付けられているすべてのオブジェクトの再帰コピーを指します。データ構造にポインタSであるメンバー変数が含まれている場合、 (say、)のインスタンスを(say、)の別のインスタンスにディープコピーすることは、の変数が指す各オブジェクトを再帰的にコピーして、関連付けられている同じオブジェクトではなく、それらのオブジェクトのコピーに関連付けられるようにします(浅いコピーの場合)。Ss1Ss2s1s2s1

ここでは、ポインタメンバー変数がないため、「深い」コピーと「浅い」コピーの概念は、このコンテキストではその意味を失います。

于 2013-01-16T18:11:21.920 に答える
1
  1. ->ポインタがある場合、および参照がある場合に使用します.。データメンバーは、自分自身への変更不可能なポインタであるthis->ObjectBDataMemberためにアクセスされます。thisしたがって、->にアクセスするには(オフセット)演算子が必要ObjectBDataMemberです。thisオブジェクト自体のデータメンバーにアクセスするために自己参照ポインタを使用する必要がないことに注意してください。これは、コードがオブジェクト自体のデータメンバーにアクセスしていることを強調するために使用される単なるスタイルです。別のオブジェクトのデータメンバーにアクセスしていて、それらが同じメンバーを持っている場合に便利です(同じオブジェクトタイプであるため)。

  2. これらのオブジェクトには割り当てられたオブジェクトはなく、単なる古いデータ型です。だからそれは浅いコピーです。オブジェクトの浅いコピーはその値をコピーしますが、新しいオブジェクトを割り当てません。割り当てられたオブジェクトへのポインタのみをコピーします。ディープコピーは、すべての値型メンバーのコピーを作成し、独自に割り当てられたオブジェクトを作成します(通常、ソースコピーされたオブジェクトのサブオブジェクトの値をコピーします)。

于 2013-01-16T18:20:06.613 に答える
0

this->ObjectBDataMember深いコピーや浅いコピーとは何の関係もありません。 thisはポインタであるため、そのメンバーは常に。を介してアクセスされ->ます。まあ、あなたはすることができます(*this).ObjectBDataMember

の違い

int ObjectBDataMember;

int *ObjectBDataMember;

設定したい場合は、次のようにします。

this->ObjectBDataMember = 5;

vs

*(this->ObjectBDataMember) = 5;
于 2013-01-16T18:10:15.283 に答える
0
  1. thisは(ポインター) であるためObjectBType*、そのメンバーにアクセスするには、 を指定する必要があります->。ところで、thisメンバー関数の暗黙的な変数であり、省略できます。ObjectBDataMember = objecta->DataAccessor();
  2. ObjectADataMember の型は int であり、基本型 (複合型ではない) であるため、単なるコピーです。一時的な「ディープ コピー」は、複合型に適用されます。

最初に、優れた C++ の本を読み終えることをお勧めします。これにより、このような潜在的な疑問が数多く解決されます

于 2013-01-16T18:11:54.500 に答える