【问题标题】:Is there a cyclic dependency here?这里有循环依赖吗?
【发布时间】:2013-02-15 17:41:50
【问题描述】:

下面我复制了我的部分代码的简化版本,它在编译时会出错。

testing.cpp

#include <iostream>
#include "../Beta.h"
#include "../Alpha.h"

using namespace std;

int main() {
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
}

Alpha.h

#include <vector>

class Alpha
{
    public:

        typedef struct _info{
            int  k;
        } info;

        friend class Beta;
};

Beta.h

   #include <vector>
    
        class Alpha;
        
        class Beta
        {
            public:
            std::vector <Alpha::info*> vecInfo;
        };

当我运行 g++ testing.cpp 时,我收到以下错误消息

在 testing.cpp:10:0: ../Beta.h:8:15: 错误中包含的文件中:

嵌套名称说明符中使用的不完整类型“Alpha”../Beta.h:8:15:

错误:嵌套名称说明符中使用的类型“Alpha”不完整

../Beta.h:8:27: 错误:模板参数 1 无效../Beta.h:8:27:

错误:模板参数 2 无效

我可以从论坛帖子中看到第一个错误是由于某种循环依赖(Error: incomplete type used in nested name specifier)。我看不到我的代码和他们的代码之间的相似性。我做错了什么。

【问题讨论】:

  • 这不是循环依赖。这只是意味着您不能引用Alpha::info*,因为之前没有声明过。

标签: c++ class vector g++


【解决方案1】:

这并不是真正的循环依赖。 Beta.h 只需要#include "Alpha.h" 而不是前向声明class Alpha;

【讨论】:

  • 但是 Alpha.h 必须转发声明 Beta,这样你就可以使它成为 Alpha 的朋友,不是吗?
  • 不,您可以声明一个以前从未声明过的friend 类。如果你想声明 class Beta; 可能会更清楚一点,当然。
  • 谢谢,但是当我将 class Alpha; 替换为 #include Alpha.h In file included from testing.cpp:11:0: ../Alpha.h:3:7: error: redefinition of ‘class Alpha’ ../Alpha.h:3:7: error: previous definition of ‘class Alpha’ 时,会出现不同的错误
  • 听起来您缺少包含防护。 en.wikipedia.org/wiki/Include_guard
  • @user13107 您可能缺少包含警卫。看我的回答。
【解决方案2】:

您需要在Beta.h 中包含Alpha.h,因为需要完整的类定义才能访问Alpha::info。这不会产生循环依赖,因为Alpha.h 不包括Beta.h

// don't forget the include guards!
#ifndef BETA_H_
#define BETA_H_

#include <vector>
#include "../Alpha.h"

class Beta
{
    public:
    std::vector <Alpha::info*> vecInfo;
};

#endif

【讨论】:

  • 你能告诉我我的代码最初有什么问题吗?为什么我写class Alpha时看不懂?我在哪里可以了解有关此特定问题的更多信息?我不知道这个的技术术语。
  • @user13107 前向声明只是说“有一个名为 Alpha 或其他名称的类,我们对此一无所知”。当您在代码中说出“Alpha::info”之类的内容时,该代码需要访问Alpha 类的完整定义。否则它无法知道 abour Alpha::info
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2018-09-30
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多