调用没有头文件的c ++类

时间:2014-03-07 23:09:07

标签: c++

我有一个名为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文件夹中

5 个答案:

答案 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 ++更自动的方式处理这个问题。