我有一个名为fooTest.cpp的文件中的以下类:
#include <iostream>
#include <string>
using namespace std;
class foo
{
private:
float price;
public:
foo():price(0){}
foo(float p)
{
price=p;
}
void print()
{
cout<<price;
}
};
我的主程序在另一个名为test.cpp
的文件中#include <iostream>
using namespace std;
int main(void)
{
foo p1;
p1.print();
system("PAUSE");
return 0;
}
问题是它无法识别对象p1,为什么会这样?我不想在这个程序中使用标题
旁注:我使用的是Visual C ++,两个文件都在同一个Source Files文件夹中
答案 0 :(得分:4)
为什么你认为它应该是一个有效的参考? Test.cpp在编译时对其他cpp文件一无所知。只有将对象模块链接在一起时,才能解析引用。你需要使用标题。这是一种标准做法。
答案 1 :(得分:2)
** 问题是它无法识别对象p1,为什么会这样? * *
编译源模块时,编译器唯一看到的是您在该模块中提供的内容。
#include <iostream>
using namespace std;
int main(void)
{
foo p1;
p1.print();
system("PAUSE");
return 0;
}
你在哪里看到foo的定义?你没有看到它,编译器也没有。编译器看到“foo p1;”并告诉你“什么是foo?”
** 旁注:我使用的是Visual C ++,两个文件都在同一个Source Files文件夹中 **
如果您认为编译器会对其他模块进行目录搜索以找出这些未知类型,那么您就错了。 C ++不会那样工作 - 它会编译它给出的内容,因此在开始使用它之前必须告诉编译器foo是什么。
答案 2 :(得分:0)
您始终可以将fooTest.cpp直接包含在test.cpp中,并使用
直接编译gcc test.cpp
但话又说回来,你为什么不用标题呢?并定期编译,如
gcc test.cpp fooTest.cpp
并且,如果没有任何引用fooTest.cpp
,你如何期望它正确编译答案 3 :(得分:0)
您不能使用尚未定义的类。无论如何,编译器必须在编译class foo
时看到test.cpp
的定义。
您可以通过将其移动到标题或来完成此操作,您只需将类定义复制并粘贴到test.cpp
即可。但复制它是一个坏主意,因为当你将来对类进行更改时,你必须在两个地方进行每次更改。必须始终在所有看到的文件中以相同的方式定义类。
这正是头文件的用途:在多个源文件中生成相同的代码,而无需维护多个相同的代码副本。
答案 4 :(得分:0)
您必须在每个源文件中包含类声明,该文件引用或定义基于该类的对象。执行此操作的标准方法是将类声明放在头文件中,以便给定命名类的声明是相同的。
如果您不想在头文件中包含类声明,那么只需在引用它的每个源文件中包含类声明。在您的情况下,复制
class foo
{
/* the rest of your fooy guts */
};
进入test.cpp。
你是个Java程序员吗?不幸的是,Java以比C ++更自动的方式处理这个问题。