【问题标题】:How to set a class or super class of oneself to an instance in C++如何将自己的类或超类设置为C++中的实例
【发布时间】:2013-01-27 06:01:50
【问题描述】:

标题可能听起来有点混乱,我的意思是我有一个扩展类 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++ 中似乎不一样,thisconst,无法更改,我不确定 .super()一切正常。

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

【问题讨论】:

  • 前段时间我也遇到过同样的问题,我发现的一种方法是将父方法声明为虚拟方法,然后在子类中限定它的范围。
  • 这是一个常量指针。它不是指向 const 对象的指针。你可以在 setA 中做的是 this *((B*)this) = b;虽然这不是一个好方法。你应该做的是在 B 中有一个名为 void Set(const B& b); 的函数。复制。这将自动被 A “继承”。这里的优点是 B 知道它的所有成员(包括私有成员)。 A 并不认识 B 的所有成员。
  • "在 java 中有 ... 而在 C++ 中似乎不一样" 当然有。如果你在 Java 中明确说明你的意思,我们可以在 C++ 中演示等价物。

标签: c++ inheritance this


【解决方案1】:

前言:

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

【讨论】:

  • “故事有点不同” “故事”没有什么不同。 语法 因语言而异。 “如果你想模拟原始的 Java 行为”不是“模拟”;它只是 C++ 中与 Java 代码等价的语法。
  • 我会跳过演员阵容,只做B::operator=(a);
  • @newacct,不,故事真的不一样。在 Java 中,您可以重新分配引用(如 C++ 指针),但在 C++ 中则不能。为什么我写“模拟”是因为,指针和Java的引用并不完全相同,但有些相同。
  • @iammilind:Java 的“引用”是指向对象的指针。您可以在 C++ 中重新分配指针。是一样的。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-02-09
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2015-05-29
    相关资源
    最近更新 更多