C++循环依赖
Posted
技术标签:
【中文标题】C++循环依赖【英文标题】:C++ circular dependency 【发布时间】:2013-12-06 03:28:09 【问题描述】:我有一个对象类,一个异常类派生自它。 现在我想要一个对象类的方法抛出一个异常对象但遇到无休止的“未定义基类”和“不完整类型”问题。这甚至可能吗?
谢谢。
代码:
class object
public:
virtual ~object()
virtual bool equals() throw new exception;
virtual int getHash() throw new exception;
virtual void getType() throw new exception;
;
class exception :
public object
private:
public:
exception();
virtual ~exception();
virtual const char* info();
;
【问题讨论】:
@user7236293 已编辑。谢谢:) @ValekHalfHeart 我试过但得到“不完整的类型” 【参考方案1】:不要在类中定义成员函数。在定义了两个类之后再定义它。
【讨论】:
我必须把它放到一个单独的cpp文件中吗? 在标题中将其定义为内联。 “内联”是指语言关键字还是只是将实现放在类声明之后?我尝试了后一种,它有效.... @babel92: inline 是 c++ 关键字,允许您在方法的声明处直接实现。 @user1920482 -inline
允许在同一函数的不同翻译单元中进行多个定义;没有它,那将违反单一定义规则。【参考方案2】:
在这种特定情况下,只需将类 object
的实现放在单独的 cpp 文件中,只在标头中保留声明。
【讨论】:
我相信在大多数情况下,将 impl 放在它自己的 cpp 文件中是首选方式(除非用于内联/模板等)。 C/C++ 不像 Java/C# 等其他语言那样工作。将你的 impl 放在头文件中会在未来的编译中导致很多问题。如果您真的想始终将 impl 与您的声明放在一起,请不要选择 C/C++ :) 其实我在做一个类似.NET的框架,是为了练习模板编程,想让它整洁(也就是说,每当我想使用它时,我只需要一个“包含” ) 不过现在好像有点难了:)【参考方案3】:你需要异常类从对象类继承吗?如果您不想要单独的 cpp 文件,您可以在头文件中的对象类之前定义异常类。
class exception
private:
public:
exception();
// rest of your code
;
class object
public:
virtual ~object()
virtual bool equals() throw exception();
// rest of your code
;
【讨论】:
其实我需要它继承自对象类:)以上是关于C++循环依赖的主要内容,如果未能解决你的问题,请参考以下文章