c++中的循环继承
Circular Inheritance in c++
我有三个类,我想在另一个类中使用它们中的每一个类似:
class Object
{
public:
Object();
~Object();
protected:
int x;
int y;
private:
Line l;
Circle c;
};
class Line : public Object
{
public:
Line ()
{
x = x+y;
}
~Line ();
private:
};
class Circle : public Object
{
public:
Circle()
{
x = x/y;
}
~Circle();
private:
};
所以这里的问题是,我在编译时得到一个错误,它说base undefined,我尝试过使用#define
和#ifdefine
,但都不起作用。
理想情况下,我想做的是在main
中有一个对象要调用,所有其他要使用的变量都将设置在那里,同时这个对象可以不同,这样它可以是Line
或Circle
。
您不能这样做。编译器不可能做到这一点。
相反,您必须有指向对象的指针,而不是它们的直接实例。
然后做所谓的类的"前向"声明:
class Circle;
class Line;
class Object
{
Line* line;
Circle* circle;
}
当然,与其使用原始指针,不如使用智能指针。
我的猜测是,您希望任何对象要么是原始图形对象,如直线或圆,要么是复合对象,即包含多个其他对象的对象。
你实际上已经快到了:你应该做的是:
-
从Object中删除
Object
子类实例(关于这是一个设计错误的原因,请参阅其他答案(, -
创建继承
Object
:的第四个类class Compound : public Object { public: Compound(){ } private: Line line; Circle circle; };
现在,如果您想以通用的方式操作对象列表,这很容易。您只需要在Object
上定义特别的虚拟方法,并在子类中覆盖它们(例如draw
方法(。
有关多态性概念的更多解释,请参阅本教程。
想想看:
- 每个CCD_ 10包含一个CCD_
- 每个CCD_ 12是一个CCD_
- 因此,每个
Object
包含一个Object
- 当然,CCD_ 16又包含一个CCD_ 17
- 它包含一个
Object
。。。等等,直到你累了
这是一种设置无限递归数据结构的尝试,您可能会看到为什么不允许这样做。
相反,使用前向声明和(智能(指针(unique_ptr<>
似乎是这里的最佳选择(来打破相互依赖关系,并允许终止递归结构(指针可以为null(:
#include <memory>
// Forward declarations
class Line;
class Circle;
class Object
{
public:
Object();
~Object();
protected:
int x;
int y;
private:
std::unique_ptr<Line> l;
std::unique_ptr<Circle> c;
};
class Line : public Object
{
public:
Line ()
{
x = x+y;
}
~Line ();
};
class Circle : public Object
{
public:
Circle()
{
x = x/y;
}
~Circle();
};
您不能执行刚才描述的操作。基类不能包含从基类派生的类。当类派生时,它包含基类的所有组件。因此,在您的示例中,Object包含一条直线和一个圆。圆包含包含圆和线的对象-你可以看到,我们可以像1/3中的3一样。。。
您可以有一个指向Line或Circel类对象的引用或指针,例如
class Line;
class Circle
在Object类之前需要上面的行-它告诉编译器"有一个Line类和一个Circle类。我稍后会讨论它们实际包含的内容…">
class Object
{
public:
Object();
~Object();
protected:
int x;
int y;
private:
Line* l;
Circle* c;
};
为了使成员变量具有给定类型(如"Circle c
"(,类定义必须已出现在转换单元中。所以,在这种情况下,你所要求的是不可能的。
但是,指向对象的指针只需要编译器知道符号(如"Circle"(代表一个类。您可以通过正向类声明来实现这一点。所以是一种选择
class Circle;
class Line;
class Object {
public:
...
Circle *c;
Line *l;
}
class Line: public Object { ... }
class Circle: public Object { ... }
在您的代码中,Object
对象包含一个Circle
子对象(数据成员(,而该子对象又包含Object
子对象(基类子对象(;
这产生了无限大,这相当不好。
然而,解决方案非常简单:不要从Object
派生这些类。
- 如何循环打印顶点结构
- 继承函数的重载解析
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 在C++中循环访问类继承
- 循环依赖,在继承类的情况下使用覆盖方法
- C++ 继承向量问题(无限循环+在其他类中使用向量的问题)
- 正在从继承中解析循环依赖项
- C++ 上的循环依赖和继承编译错误
- 为什么嵌入类别的类别继承了外部类时没有无限循环
- C++中对继承的循环依赖
- 好奇的循环继承与C++中的混合
- C++循环依赖和继承
- 处理对继承的循环依赖
- 如何在继承boost::any中包含的std::vector的类上循环
- c++中的循环继承
- 具有继承模板类的循环依赖关系
- 继承和返回实例的循环依赖性问题
- c++继承循环依赖