打电话给没有标题的CPP课程

calling a cpp class without headers

本文关键字:CPP 课程 标题 打电话      更新时间:2023-10-16

i有以下类,该类称为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,为什么?我不想在此程序中使用标头

sidenote:我正在使用Visual C ,并且两个文件都在同一源文件文件夹中

为什么您认为它应该是有效的参考?test.cpp在编译时对其他CPP文件一无所知。只有当您将对象模块链接在一起时,才能解决引用。您需要使用标头。那是一种标准练习。

** 它没有识别对象P1的问题,为什么是?***

编译源模块时,编译器看到的唯一内容是您在该模块中提供的内容。

#include <iostream>
using namespace std;
int main(void)
{
    foo p1;
    p1.print();
    system("PAUSE");
    return 0;
}

您在哪里看到Foo的定义?您看不到,编译器也没有。编译器看到" foo p1";对你说:"什么是foo?"

** sidenote:我正在使用Visual C ,并且两个文件都在同一源文件文件夹中 **

如果您认为编译器会为您的其他模块进行目录搜索以找出这些未知类型,那么您会误会。C 不起作用 - 它编译了给定的内容,因此您必须告诉编译器在开始使用之前,Foo是什么。

gcc test.cpp

但是,再说一次,为什么不使用标头?并定期编译

gcc test.cpp fooTest.cpp

,您如何期望它正确编译,而无需任何参考脚步。cpp

您无法使用尚未定义的类。一种或另一种方式,编译器必须在编译test.cpp时看到class foo的定义。

您可以通过将其移动到标头中,您只需将类定义复制并粘贴到test.cpp中即可。但是复制它是一个坏主意,因为当您将来对班级进行更改时,您必须在两个地方进行每个更改。必须始终以所见的所有文件中的方式定义类。

这正是标题文件的目的:在多个源文件中制作相同的代码,而不必维护代码的多个相同的副本。

您必须在每个源文件中包括类声明的类声明,以引用或根据该类定义对象。这样做的标准方法是将类声明放在标题文件中,以使给定名称类的声明相同。

如果您不想将类声明包括在标题文件中,则只需在引用它的每个源文件中包含类声明即可。在您的情况下,请复制

class foo
{
/* the rest of your fooy guts */
};

进入test.cpp。

您是Java程序员吗?不幸的是,Java以比C 更自动的方式处理此操作。