打电话给没有标题的CPP课程
calling a cpp class without headers
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 更自动的方式处理此操作。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- Linux的Cpp上的计时器
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 命名空间中具有.h和.cpp文件的类
- 内置函数可查看CPP中的成员变量
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- Cpp-Tuple使用带有变量的get
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何通过cpp程序运行shell脚本
- 使用2个键的cpp-stl::优先级队列排序不正确
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 如何在cpp文件之间切换窗口?在Qt中
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我需要知道编译器如何在cpp中使用析构函数
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 打电话给没有标题的CPP课程
- CLION:调试CPP课程
- 初学者和CPP课程