C++ 调用不带头的cpp类

C++ 调用不带头的cpp类,c++,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<

我有一个名为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,为什么?我不想在此程序中使用标题


StEnoTo:我使用Visual C++,两个文件都在同一个源文件文件夹

中,可以总是将脚注.cpp直接包含到Test.CPP中,并直接用

编译
gcc test.cpp
但话说回来,为什么不使用header呢?并且像这样定期编译

gcc test.cpp fooTest.cpp

而且,您如何期望它在不引用fooTest.cpp的情况下正确编译?您可以始终将fooTest.cpp直接包含到test.cpp中,并使用

gcc test.cpp
但话说回来,为什么不使用header呢?并且像这样定期编译

gcc test.cpp fooTest.cpp

而且,如果不引用fooTest.cpp,您如何期望它正确编译?为什么您认为它应该是一个有效的引用?Test.cpp在编译时对另一个cpp文件一无所知。只有将对象模块链接在一起,才能解析引用。您需要使用标题。这是一个标准做法。

为什么您认为它应该是一个有效的参考?Test.cpp在编译时对另一个cpp文件一无所知。只有将对象模块链接在一起,才能解析引用。您需要使用标题。这是一种标准做法。

您不能使用尚未定义的类。无论如何,编译器在编译test.cpp时必须看到类foo的定义

您可以通过将其移动到标题中来实现,也可以将类定义复制并粘贴到test.cpp中。但是复制它是一个坏主意,因为以后当您对类进行更改时,您必须在两个地方进行更改。该类在所有文件中的定义方式必须始终相同


这正是头文件的用途:在多个源文件中生成相同的代码,而不必维护代码的多个相同副本。

您不能使用未定义的类。无论如何,编译器在编译test.cpp时必须看到类foo的定义

您可以通过将其移动到标题中来实现,也可以将类定义复制并粘贴到test.cpp中。但是复制它是一个坏主意,因为以后当您对类进行更改时,您必须在两个地方进行更改。该类在所有文件中的定义方式必须始终相同


这正是头文件的用途:在多个源文件中生成相同的代码,而不必维护代码的多个相同副本。

您必须在引用或定义基于该类的对象的每个源文件中包含类声明。实现这一点的标准方法是在头文件中放置类声明,以便给定命名类的声明是相同的

如果不想在头文件中包含类声明,那么只需在引用它的每个源文件中包含类声明即可。在你的情况下,复制

class foo
{
/* the rest of your fooy guts */
};
进入test.cpp


你是Java程序员吗?很不幸,java比C++更自动地处理这个问题。

< p>你必须在每个源文件中包含类引用,该类引用引用或定义基于该类的对象。实现这一点的标准方法是在头文件中放置类声明,以便给定命名类的声明是相同的

如果不想在头文件中包含类声明,那么只需在引用它的每个源文件中包含类声明即可。在你的情况下,复制

class foo
{
/* the rest of your fooy guts */
};
进入test.cpp

你是Java程序员吗?java处理这个问题的方式比C++更为自动化,很不幸。

*问题,它不认识对象P1,为什么?**< 编译源模块时,编译器看到的唯一东西就是在该模块中给出的内容

#include <iostream>
using namespace std;
int main(void)
{
    foo p1;
    p1.print();
    system("PAUSE");
    return 0;
}
你在哪里看到了foo的定义?你看不到它,编译器也看不到。编译器看到foop1;对你说什么是福

中 如果您认为编译器会对其他模块进行目录搜索以找出这些未知类型,那么您就错了。C++不这样工作——它编译它所给的,因此必须在编译器开始之前告诉编译器它是什么。

< p> **它不认识对象p1,为什么?**< 编译源模块时,编译器看到的唯一东西就是在该模块中给出的内容

#include <iostream>
using namespace std;
int main(void)
{
    foo p1;
    p1.print();
    system("PAUSE");
    return 0;
}
你在哪里看到了foo的定义?你看不到它,编译器也看不到。编译器看到foop1;对你说什么是福< /p>
如果您认为编译器会对其他模块进行目录搜索以找出这些未知类型,那么您就错了。C++不这样工作——它编译它所给的,因此必须在编译器开始之前告诉它什么是FO。< /P>避免使用标题的原因是什么?避免使用标题的原因是什么?