C ++无法从main.cpp中的另一个文件实例化一个类

时间:2011-05-08 18:30:12

标签: c++ class linker

我无法让这个工作

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

我很感激任何帮助!!!

5 个答案:

答案 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

第一种方法是标准的,是保持模块化和封装的良好编程实践......