0

タイトルは少し紛らわしいかもしれませんが、つまり、クラス B を拡張するクラス A があるため、B のすべてのプロパティを持ち、クラス B をインスタンスに設定したいということです (B のすべての変数が変更されています)。このようにして、B は別の場所から更新され、A は対応する効果を持ち、A を操作して個々の相互作用を行うことができます。コードは以下の通りです。

class A : public B
{
public:
    A()  {}
    ~A() {}

    void setA(B b)
    {
               // NOT SURE WHAT TO DO HERE
    }

};

Java にはthisandが.super()あり、C++ では同じようには見えずthisconstand は変更できず、どのように機能するのかわかりません.super()

ところで、クラス A 自体を A の別のインスタンスに表示することは可能ですか?

4

2 に答える 2

0

変更時に最新の値が表示setA(B b)されるように、一度だけ呼び出したいと思いますか? その場合、サブオブジェクトを置き換えようとしていますが、これは不可能です。bA

B*達成しようとしているユースケースでは、メンバー変数であれば適切です。B?の基本クラスでなければならない理由はありAますか。実名で具体例を挙げたり、詳しく説明したりした方がよいでしょう。

于 2013-01-27T06:30:21.073 に答える
0

序文:

Javaで書くと、

A a1 = new A();
A a2 = a1;

a1とはa2同じオブジェクトを参照しています。
しかし、C++ では話は少し異なります。new A()オブジェクトを常に作成する必要があるとは限りません。

以下のように自動オブジェクトを作成するとします。

A a1; // a1 is created on stack
A a2 = a1; // a2 is created on stack and copied from a1

a1a2は同じ値を持つ異なるオブジェクトであることに注意してください。それらは同じエンティティを参照していません。a2参考にしたい場合は、以下のa1ように書いてください。

A &a2 = a1;

元の Java の動作をシミュレートする場合は、ポインターが役立ちます。

A *a1 = new A();
A *a2 = a1;

答え:

ここまでで、上記の C++ オブジェクトと参照の違いがわかります。

そうは言っても、C++ には を使用するよりもオブジェクトを設定するためのより良い方法がありますsetA()。単純にオーバーロードできますoperator =

class A : public B
{
  int member; // some member variable

public:
  A& operator = (const A &a) // don't need to use `B&`
  {
    *(static_cast<B*>(this)) = a; // this calls `B::operator =`
    this->member = a.member;  // copy other members likewise
    return *this;
  }
};

使用法:

A a1, a2;
a1 = a2; // calls B::operator = and A::operator =

operator =また、クラス内で常に定義する必要があるとは限らないことに注意してください。実際に必要になる特殊なケースがいくつかあります。デフォルトでは、コンパイラはコピー コンストラクタと代入演算子を生成し、コピーを実行します。

于 2013-01-27T06:10:48.317 に答える