繁体   English   中英

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

[英]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.objadd.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM