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++循环依赖的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的循环依赖

C++ 循环依赖,未声明的标识符

不同命名空间内的类的循环依赖 C++

解决由于类之间的循环依赖而导致的构建错误

解决由于类之间的循环依赖而导致的构建错误

解决由于类之间的循环依赖而导致的构建错误