2013-04-22 67 views
1

我是一个完整的初学者在C++和什么可能看起来愚蠢显而易见你我只是无法让我的头。C++重定义 - 头文件

Testapp.h

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

的main.cpp

#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

一个函数的声明也当它给出实现或bo时的定义dy的函数。您的类定义看起来像这样的构造函数的定义:

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;。即使在源文件中污染你的全局命名空间也被认为是非常糟糕的做法,但是如果你在头文件中这样做,这会变得具有传染性。

+0

谢谢你,解决了我的其他程序中几乎所有的错误。很好解释 - 现在我的主程序中只剩下一个错误! 对WinMain @ 16的未定义引用。 GRR! 我刚刚删除了你告诉我的身体。感谢命名空间的提示,我一定会考虑删除它。 – Zakerias 2013-04-22 12:26:33

1

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

Testapp() { }; 

你需要或者删除

Testapp::Testapp(){ 
} 

或更改构造函数定义声明

Testapp(); 
1

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