如何在C++中将自己的类或超类设置为实例
How to set a class or super class of oneself to an instance in 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;
那么a1
和a2
指的是同一个对象。
但在C++,故事几乎没有什么不同。您可能不需要new A()
总是创建对象。
假设您创建一个自动对象,如下所示:
A a1; // a1 is created on stack
A a2 = a1; // a2 is created on stack and copied from a1
请注意,a1
和 a2
是具有相同值的不同对象。它们不是指同一个实体。如果你想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
的基类吗?如果您用真实姓名给出具体示例或更详细地解释,那就更好了。
相关文章:
- 模板转换为超类
- 我的超类中的模板问题与结构定义
- 创建子类的多个实例,其中只有一个超类实例
- 给定一个指向对象的超类指针,如何获取对象的大小?
- 重写另一个方法 [C++] 使用的超类回调函数
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- C++为API中定义的结构创建超类
- 使用派生类C++方法的超类
- 确保指向超类的指针指向c++中某个子类的对象
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 在从给定超类继承的所有类上调用虚函数
- 是否可以为所有子类设置一个实例?
- 如何使 Swig 发出C++超类
- 如何根据构造函数参数使用超类类型初始化成员变量?
- C++:从类型索引中获取超类类型索引
- 为什么编译器找不到超类的方法?
- 无法使用子类变量访问超类公共成员
- 如何在C++中将自己的类或超类设置为实例
- 如何在超类中设置CComPtr上的接口