我无法让这个工作
Addr.h
#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
Addr.cpp
#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:“public:int __thiscall Foo :: Manipulate(int,int)”(?Manipulate @ Foo @@ QAEHHH @ Z)已经在addr.obj中定义了c:\ Users \ christian \ documents \ visual studio 2010 \ Projects \ Console Test \ Console Test \ main.obj
错误LNK2005:“public:__ thiscall Foo :: Foo(int,int)”(?? 0Foo @@ QAE @ HH @ Z)已在addr.obj中定义c:\ Users \ christian \ documents \ visual studio 2010 \ Projects \ Console Test \ Console Test \ main.obj
错误LNK2005:“public:__thiscall Foo :: Foo(void)”(?? 0Foo @@ QAE @ XZ)已在addr.obj中定义c:\ Users \ christian \ documents \ visual studio 2010 \ Projects \ Console Test \ Console Test \ main.obj
错误LNK1169:找到一个或多个多重定义的符号c:\ users \ christian \ documents \ visual studio 2010 \ Projects \ Console Test \ Release \ Console Test.exe
我很感激任何帮助!!!
答案 0 :(得分:4)
#include "addr.cpp"
您将.cpp文件包含在main.cpp
中,这是造成问题的原因。您应该包含头文件,如:
#include "addr.h" //add this instead, to your main.cpp
因为它的头文件包含类Foo
的定义。
答案 1 :(得分:2)
在main.cpp中,您应该包含头文件,而不是cpp文件。
更改
#include "addr.cpp"
要
#include "addr.h"
答案 2 :(得分:1)
在main.cpp
#include "addr.cpp"
应该是
#include "addr.h"
如果您#include "addr.cpp"
,则可以编译main.cpp
(甚至将其链接到自己的可执行文件中),但是当您链接main.obj
和{{1}时你得到一个重复的定义错误,因为现在在两个目标文件中完全定义了类add.obj
。
答案 3 :(得分:0)
您可以#include“addr.h”(如前所述),或者使构建系统不编译addr.cpp。前者通常是首选,虽然后者也可以解决问题,并且经常与自动代码生成工具的输出一起使用。
答案 4 :(得分:0)
有两种方法可以将类数据导入main.cpp
1)在main.cpp文件中包含头文件“addr.h”,所以现在你有了类和成员函数的定义,但是没有它们的实现部分。所以在编译时,代码应该是:
g++ addr.cpp main.cpp
。2)在main.cpp中包含cpp文件“addr.cpp”,因此你自动定义“addr.hpp”包含在“addr.cpp”中。现在,您必须只编译main.cpp文件:
g++ main.cpp
。
第一种方法是标准的,是保持模块化和封装的良好编程实践......