【问题标题】:Undefined type error even with forward declaration即使使用前向声明也未定义类型错误
【发布时间】:2015-09-21 17:43:40
【问题描述】:

我正在阅读循环引用和前向声明。我确实理解在头文件中包含实现不是一个好的设计实践。但是我正在试验,无法理解这种行为。

使用以下代码(包含前向声明)我希望它能够构建,但是我收到了这个错误:

Error   1   error C2027: use of undefined type 'sample_ns::sample_class2'

头文件.hpp

#ifndef HEADER_HPP
#define HEADER_HPP
#include "Header2.hpp"
namespace sample_ns
{
    class sample_class2;
    class sample_class{
    public:
        int getNumber()
        {       
            return sample_class2::getNumber2();
        }
    };
}
#endif

Header2.hpp

#ifndef HEADER2_HPP
#define HEADER2_HPP
#include "Header.hpp"
namespace sample_ns
{
    class sample_class;
    class sample_class2{
    public:
        static int getNumber2()
        {
            return 5;
        }
    };
}
#endif

显然我错过了一些东西。有人可以指出我为什么会收到此错误的正确方向。

【问题讨论】:

  • sampele_class => sample_class 你已经在这里发布了你的真实代码,你必须这样做。
  • 正在试验代码并打错了。
  • 将声明与定义分开。请看这个:stackoverflow.com/questions/625799/…

标签: c++ header-files forward-declaration circular-reference


【解决方案1】:

You can only get away with forward declare if you have pointers or references。由于您使用的是该类的特定方法,因此您需要完整的包含。

但是,对于您当前的设计,您有一个循环依赖。更改您的 Header2 文件以删除 "Header.hpp" 并转发声明 sample_class 以解决循环依赖关系。

#ifndef HEADER2_HPP
#define HEADER2_HPP
namespace sample_ns
{
    class sample_class2{
    public:
        static int getNumber2()
        {
            return 5;
        }
    };
}
#endif

【讨论】:

  • 感谢您的链接。此外,是否有任何解决方法可以在不将实现移动到 cpp 文件的情况下使这种设计工作(保持循环依赖,即假设我必须在 Header2 中使用 sample_class 的对象)。
  • “假设我需要一个循环依赖。” 那你就死定了。根据定义,编译具有循环依赖的代码是不可能的。
  • 我可能会将定义移至 cpp 文件。谢谢
  • @CoryKramer,不,不可能有一个聚合循环依赖。 IE。您不能在另一个完整的类对象中拥有完整的类对象。做一个指针,你就能解决问题。
  • @Adrian 这实际上是我回答的第一行。但这不是一个循环依赖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2018-10-07
相关资源
最近更新 更多