[英]C++ Cannot instantiate a class from another file in main.cpp
我无法使它正常工作
地址
#ifndef ADDR_H
#define ADDR_H
class Foo{
public:
Foo(); // function called the default constructor
Foo( int a, int b ); // function called the overloaded constructor
int Manipulate( int g, int h );
private:
int x;
int y;
};
#endif
地址
#include "addr.h"
Foo::Foo(){
x = 5;
y = 10;
}
Foo::Foo( int a, int b ){
x = a;
y = b;
}
int Foo::Manipulate( int g, int h ){
return x = h + g*x;
}
main.cpp
#include "addr.cpp"
int main(){
Foo myTest = Foo( 20, 45 );
while(1){}
return 0;
}
我究竟做错了什么? 我得到这些链接器错误:
错误LNK2005:“公共:int __thiscall Foo :: Manipulate(int,int)”(?Manipulate @ Foo @@ QAEHHH @ Z)已在addr.obj c:\\ Users \\ christian \\ documents \\ visual studio 2010 \\ Projects \\中定义控制台测试\\控制台测试\\ main.obj
错误LNK2005:“公共:__thiscall Foo :: Foo(int,int)”(?? 0Foo @@ QAE @ HH @ Z)已在addr.obj c:\\ Users \\ christian \\ documents \\ visual studio 2010 \\ Projects \\中定义控制台测试\\控制台测试\\ main.obj
错误LNK2005:“公共:__thiscall Foo :: Foo(void)”(?? 0Foo @@ QAE @ XZ)已在addr.obj c:\\ Users \\ christian \\ documents \\ visual studio 2010 \\ Projects \\ Console Test \\ Console中定义测试\\ main.obj
错误LNK1169:找到一个或多个乘法定义的符号c:\\ users \\ christian \\ documents \\ visual studio 2010 \\ Projects \\ Console Test \\ Release \\ Console Test.exe
我将不胜感激!
#include "addr.cpp"
您将.cpp文件包含在main.cpp
,这是导致问题的原因。 您应该改为包含头文件,如下所示:
#include "addr.h" //add this instead, to your main.cpp
因为它的头文件包含类Foo
的定义 。
在main.cpp中,应该包括头文件,而不是cpp文件。
更改
#include "addr.cpp"
至
#include "addr.h"
在main.cpp
#include "addr.cpp"
应该
#include "addr.h"
如果#include "addr.cpp"
,则可以编译main.cpp
(甚至将其自身链接到可执行文件中),但是当链接main.obj
和add.obj
,会得到重复的定义错误,因为class现在,在两个目标文件中都完全定义了Foo
。
有两种方法将类数据放入main.cpp
1)在main.cpp文件中包含头文件“ addr.h”,因此现在您有了类和成员函数的定义,但是没有其中的实现部分。 因此,在编译时,代码应为:
g++ addr.cpp main.cpp
。2)在main.cpp中包含cpp文件“ addr.cpp”,因此,由于“ addr.cpp”中包含“ addr.h”,因此您也会自动具有定义。 现在,您仅需编译main.cpp文件:
g++ main.cpp
。
第一种方法是标准的,是保持模块化和封装的良好编程习惯。
您可以#include“ addr.h”(如上所述),也可以使生成系统不编译addr.cpp。 通常,前者是首选,尽管后者也可以解决问题,并且经常与自动代码生成工具的输出配合使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.