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++ 中似乎不一样,this是 aconst并且无法更改,我不确定它是如何.super()工作的。

顺便说一句,有可能看到类 A 本身到 A 的另一个实例吗?

4

2 回答 2

0

前言:

如果你在 Java 中编写,

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

然后a1a2指的是同一个对象。
但在 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 回答
0

我认为您只想调用setA(B b)一次,以便在b更改时A看到最新值?如果是这样,您正在尝试替换子对象,这是不可能的。

对于您尝试实现的用例,如果B*是成员变量,那将是恰当的。有什么理由B必须是A? 的基类。最好能给出一个实名的具体例子或者更详细的解释。

于 2013-01-27T06:30:21.073 回答