如何在C++中将自己的类或超类设置为实例



>标题可能听起来有点令人困惑,我的意思是我有一个扩展类 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中,有this.super(),在C++中似乎不一样,this是一个const,无法更改,我不确定.super()工作原理。

顺便说一句,是否可以将类 A 本身看到 A 的另一个实例?

前言:

在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 =。有一些特殊情况,当你实际需要它。默认情况下,编译器会生成复制构造函数和赋值运算符,并为您执行复制。

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

对于您尝试实现的用例,如果B*是成员变量,那将是合适的。有什么理由B必须是A的基类吗?如果您用真实姓名给出具体示例或更详细地解释,那就更好了。

最新更新