【发布时间】:2011-07-05 12:52:24
【问题描述】:
这是简化的代码!我有 C++ 文件(在哪里实现)和头文件(在哪里是类定义)!
我有一个文件:Foo.cpp,其中包含 main.h。我有文件 Bar.cpp,它使用函数 Foo.cpp 并且还包括 main.h。它使用 struct 访问 Foo 对象并调用它的函数。但是 main.h 中定义的结构?我试图这样解决它:
**IN MAIN.H**
#pragma once
class Foo;
struct FoobarPackage {
FoobarPackage(Foo *fooObj) {
soso = fooObj;
}
Foo *soso;
};
* * *
**IN FOO.CPP**
#pragma once
#include "main.h"
class Foo {
void doSomething(bool ololo) {
if (ololo) //do something else
}
};
* * *
**IN BAR.CPP**
#pragma once
#include "main.h"
#include "Foo.cpp"
class Bar {
bool killAllHumans(FoobarPackage planet) {
planet.soso->doSomething(true);
return true;
}
};
* * *
但它会导致:
Bar.cpp:8: error: invalid use of incomplete type "struct(WTF??!!! — author's comment) Foo"
main.h:3: error: forward declaration of "struct(why struct?) Foo"
我的代码有什么问题?它也不是真正的代码。我简化了我的真实项目并削减了所有不需要的东西。 Foo.cpp 和 Bar.cpp 当然有它们的头文件,其中 Foo 和 Bar 类定义在 .cpp 文件中,它只是它们的实现。还从 main() 所在的 main.cpp 调用 killAllHumans()。
*已编辑*
我知道#include 与标题一起使用,但我写道它是“伪代码”。我在我的 readl 项目中使用头文件和 cpp 文件,并且只包含头文件,#pragma once 在我的头文件中。在这个问题中,我只简化我的代码!回答前请阅读所有问题!
*EDITED2* 现在尝试编译它。有用。奇怪。
谢谢。
【问题讨论】:
-
为什么 cpp 文件中有 #pragma once?
-
不要
#include.cpp文件。 -
我不这样做。我把所有不需要的东西都剪掉了,让我的代码像伪代码一样。抱歉,但我想你会明白这一点,因为我写了我有头文件并在最后包含它们,但没有人阅读所有问题。
-
你好,@HiTECHNOLOGYs。您的伪代码令人困惑。如果您将实际代码减少到一个类似大小的包并包含一个实际的最小可编译示例程序,那会好得多。有关这将如何提供帮助的更多信息,请参阅sscce.org。顺便说一句,I 根据您的描述编写的代码在 g++ 中编译得很好。你用什么编译器?
-
你好,@Rob。我知道我的代码现在很糟糕。我使用 g++。你用的女巫旗?
标签: c++ compiler-errors redefinition