c++ - 错误 : Pointer to incomplete class type is not allowed. 我该怎么做?

标签 c++ class function pointers

所以我一直坚持这个从一个类到另一个类共享一个函数的问题,到目前为止我找到的每一个解决方案都没有解决我的问题。 这里有一个实例(我向你保证还有其他实例),[http://software.intel.com/en-us/articles/cdiag436]

酒吧.h

#ifndef __Bar_h_
#define __Bar_h_
#include "BaseApplication.h"  
#include <Foo.h>  

class Foo;  
Foo *foo;  

class Bar : BaseApplication
{
   public:
Bar(void);
~Bar(void);
   protected:
virtual void barCreate(void);
};
#endif

酒吧.cpp

#include "Bar.h"
#include <Foo.h>
Bar::Bar(void){}
Bar::~Bar(void){}
void Bar::barCreate(void)
{
     if(foo->foobar()==true) //error: pointer to incomplete class type is not allowed
        {//stuff}
}

Foo.h

#ifndef __foo_h_
#define __foo_h_
class Foo
{
public:
Foo(void);
~Foo(void);
bool foobar(void);
};
#endif

Foo.cpp

#include "Foo.h"
Foo::Foo(void){}
bool Foo::foobar(void){ return true; }

如果我能得到一些指示或解释我哪里出错了,那就太好了。

最佳答案

您误读了错误。它不是提示有一个指向不完整类型的指针,而是提示取消引用它。

if(foo->foobar()==true)

此时 foo 的类型是不完整的类型,因此编译器无法检查它是否将具有 foobar 成员函数(或成员仿函数)。

基本上对于不完整的类型,您可以声明和定义指针或引用,声明接口(interface)(采用或返回类型的函数)。但除此之外,您不能创建该类型的对象,也不能指针/引用用于除复制指针/引用以外的任何用途。

关于你做错了什么,你需要更详细地查看你的真实文件。要么你没有包含定义 Foo 的 header ,要么你有多个 Foo 类型(不同的命名空间?一个定义类型,另一个有前向声明)或者你的包含守卫是错误的,即使您包含 header ,守卫也会丢弃 header 的内容。请注意,在包含定义 Foo 的 header 之后,您不需要(也不应该)提供该类型的前向声明,因为这很容易导致多个 Foo 在不同上下文中的声明。如果删除前向声明无法编译,找出原因并修复它。

关于c++ - 错误 : Pointer to incomplete class type is not allowed. 我该怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12860199/

相关文章:

c++ - 可以使用 clang 将 C++17 与 CUDA 一起使用吗?

c++ - 纳秒和计时 C++

c++ - 使用继承时是否需要 "#include"子类父类的头文件。 C++

java - 在运行时将多个 Java 类与 ASM 组合

android - 如何在android项目的每个 Activity 中调用一个函数?

C++随机将枚举类型分配给变量

C++ 可以发现错误

c++ - 没有匹配的调用函数

javascript - 如何修复 Javascript 函数参数(当我使用变量传递参数时)

function - 我正在寻找一种简单的解决方案,使用下面的现有代码单击缩略图,即可加载新的/不同的mp3声音文件