c++ - 如何在基类中创建子类对象
问题描述
我想做的是:
- 在类中有一个
Sub
类对象Base
。 - 使
Sub
类访问Base
类的变量
基数.h
#include "Sub.h"
class Base
{
Sub subobject
int x;
}
子.h
#include Base // to acces x from .cpp file
class Sub: public Base
{
void changevar();
}
子文件
#include "Sub.h"
// I tried to include base in here but that did not work either
void Sub::changevar()
{
x++;
}
但是我不断收到 undefines base class 和 undefined undeclared x 错误。我该如何解决这个问题?
解决方案
如果您将子对象存储为指针怎么办?
您还需要
- 在 Base 类之前在 Base.h 中声明您的 Sub 类
- 在 Base.cpp 文件中包含 Sub.h
- 调用 new 让它有指向它的东西,并且显然有一个相应的删除(注意:不在构造函数中,因为这将创建一个循环,其中 Base 创建一个 Sub,创建一个创建 Sub 的 Base)
但是,基类引用子类似乎有点奇怪,它破坏了继承的全部要点,如果您需要这样做,那么您应该重新考虑您所做的是否正确。
另请注意,Sub 将有自己的 Base 作为它的一部分,因此子对象的 Base 部分将与外部 Base 不同。
例如,如果 Base 本身有一个称为 Y 的整数,那么我们将有 Base 的 Y,但对于子对象也有一个单独的 Y。
也许更好地解释为什么基类需要子类的副本?
粗略的代码草图:
基数.h
#include "Base.h"
class Sub;
class Base
{
public:
Sub* subobject;
Base();
~Base();
void createSub();
};
基数.cpp
#include "Base.h"
#include "Sub.h"
Base::Base()
{
subobject = new Sub();
}
Base::~Base()
{
delete subobject;
}
void Base::createSub()
{
if (subobject)
return;
subobject = new Sub();
}
子.h
#include "Base.h"
class Sub : public Base
{
void changevar();
int x = 0;
};
子文件
void Sub::changevar()
{
x++;
}
推荐阅读
- android - Nativescript如何在后台发出http请求
- python - 如何在 PyTorch 中加载具有多个 JSON 注释的图像
- maven - VSCode - Maven.archetype.generate 失败
- android - Android Studio 看起来不合适
- php - 使用 Xdebug 和 PhpStorm 找不到 Symfony ContainerAwareCommand
- mysql - MySQL - 如何选择日期时间字段不等于 0000-00-00 00:00:00 的行?
- mysql - MySQL XAMPP 总是打开一个网络命令弹出窗口
- r - 在地图函数中使用条件改变多个列
- java - Java 8 Stream,由于几个条件而获取字符串长度
- ssl - 在 JBoss EAP 6.4 中禁用主机名验证