1

我是 C++ 的一个完整的初学者,对你来说似乎很愚蠢的事情我就是无法理解。

测试应用程序.h

#ifndef TESTAPP_H
#define TESTAPP_H
using namespace std;
class Testapp {
private: 
public:
Testapp() { };   
};
#endif

主文件

#include <cstdlib>
#include <iostream>
#include "Testapp.h"
Testapp::Testapp(){
}
int main(int argc, char *argv[])
{
system("PAUSE");
return EXIT_SUCCESS;
}

错误信息:Redefinition of 'Testapp::Testapp()'

猜测它定义了两次构造函数,虽然我不确定如何克服这个问题。我正在使用 DEV-C++。

4

4 回答 4

4

函数声明在给出函数的实现或主体时也是一个定义。您在类定义中有一个构造函数定义,如下所示:

Testapp() { };  

它的身体{ }是空的。然后您的main.cpp文件中有另一个定义,如下所示:

Testapp::Testapp(){
}

同样,这个函数定义有一个空的主体。仅仅因为功能实现完全一样,并不意味着没问题。在一个定义规则下,一个函数不能有多个定义。一个简单的解决方法是通过不提供主体使类定义中的一个仅声明:

Testapp();

或者,您可以完全摆脱定义main.cpp。你最终会做什么取决于你想要如何布局你的代码。一个典型的方法是有一个包含类定义和成员函数声明的头文件,Testapp.h

#ifndef TESTAPP_H
#define TESTAPP_H
using namespace std;
class Testapp {
private: 
public:
Testapp(); // Just a declaration
};
#endif

然后在这个类的实现文件中Testapp.cpp,给出成员函数定义:

#include "Testapp.h"

Testapp::Testapp() { }

然后在 中main.cpp,只需包含头文件并使用它定义的类:

#include "Testapp.h"

int main(int argc, char *argv[])
{
  Testapp test;
  return 0;
}

我建议using namespace std;从你的头文件中删除。即使在污染全局命名空间的源文件中,这也被认为是非常糟糕的做法,但是如果您在头文件中这样做,这将变得具有积极的传染性。

于 2013-04-22T09:51:35.827 回答
2

在您的头文件中,您只想编写一个函数“存根”或函数原型

class Testapp {
  private: 
  public:
  Testapp();   
};

您需要了解C++ 中函数声明(原型)和函数定义之间的区别。

于 2013-04-22T09:51:51.310 回答
1

你已经Testapp::Testapp在你的类声明中定义了

Testapp() { };   

您需要删除

Testapp::Testapp(){
}

或将构造函数定义更改为声明

Testapp();   
于 2013-04-22T09:51:17.970 回答
1

它确实定义了两次——一次在 Testapp.h 中,一次在 main.cpp 中,只需删除其中一个。

于 2013-04-22T09:51:42.290 回答