0

私はJavaから来ていますので、ご容赦ください。他のいくつかの記事を読みましたが、答えが見つからないようです。

以下に示す基本クラス (Obj) ヘッダー ファイルがあります。

class Obj {
public:
    Obj();
    Obj(int);
    int testInt;
    virtual bool worked();

    Obj & operator = (const Obj & other) {
        if(this != &other) {
            //other.testInt = this->testInt;
            return *this;
        }
    }
};

基本クラス

Obj::Obj() {

}

Obj::Obj(int test) {
    this->testInt = test;
}

bool Obj::worked() {
    return false;
}

これが子クラスのヘッダーです

class Obj1 : public Obj {
public:
    Obj1();
    Obj1(int);
    virtual bool worked();
};

子クラス

#include "Obj1.h"

Obj1::Obj1() {

}

Obj1::Obj1(int a) {
    this->testInt = a / 2;
}

bool Obj1::worked() {
    return true;
}

これが私のメインクラスです

int main() {
    Obj obj = Obj(99);
    Obj1 obj1 = Obj1(45);

    obj = obj1;

    if(obj.worked())
        cout << "good" << obj.testInt << endl;
    else cout << "bad " << obj.testInt  << endl;

    if(obj1.worked()) {
        cout << "1good " << obj1.testInt << endl;
    } else
        cout << "1bad " << obj1.testInt << endl;
    return 0;
}

実行時の出力は次のとおりです

bad 99
1good 22

どうすれば取得できますかobj = obj1; (上記の main にあります) obj.worked() が true を返すようにします (obj1 のクラスがそれを定義する方法であるため)? 基本的に、Javaのように動作させるにはどうすればよいですか? ディープ コピーは必要ありません。obj が参照していたものを捨てて、obj1 を指すようにしたいだけです (Java での動作はこれだと思います)。

4

2 に答える 2

-1

C++ では、オブジェクトは Java のように参照ではなく値です。割り当て (obj = obj1) は、Obj1 の Obj 部分を参照します。C++ では、ポインターまたは参照を使用する必要があります。

  • ポインター

    Obj* obj = new Obj(99);
    Obj1* obj1 = new Obj1(45);
    delete obj;// you have to free the memory manually as there's no GC in C++
    obj = obj1;
    obj->Worked();// the worked will be true here
    delete obj1; // manually delete it
    

    また、obj を介して obj1 を削除する (obj1 を削除する代わりに obj を削除する) 場合は、Obj のデストラクタを仮想に変更する必要があります。そうしないと、Obj1 のデストラクタが呼び出されません。くそー、これはC++です、楽しんでください。

  • 参照

    Obj obj = Obj(99);
    Obj1 obj1 = Obj1(45);
    Obj& obj2 = obj1;
    obj2.Worked() // should be true    
    

    この場合、ポインターとは異なり、オブジェクトはスタック上にある ('new' によって作成されない) ため、オブジェクトを削除する必要はありません。ただし、Obj& の配列 (ベクトルなど) を作成することはできません。

于 2013-09-14T01:35:49.170 に答える