一个关于重复定义的问题

brokenspoon 2009-04-08 02:16:21
小弟我建了一个C++工程,里面包含3个文件newh.h, newfun.cpp, newmain.cpp,其内容如下:

newh.h
//-----------
#ifndef MYTEST
#define MYTEST

#include <iostream>
using namespace std;

class myTTT
{
int a;
public:
void Display();
myTTT(){a = 1;}
};

void myTTT::Display()
{
cout << "You are here, a = " << a << "\n";
}

#endif

//********************
newfun.cpp
//**********This file is empty except one line
#include "newh.h"

//********************
newmain.cpp
//****************
#include "newh.h"

int main()
{
myTTT b;
b.Display();

system("pause");
return 0;
}


我编译的时候,会得到如下信息: multiple definition of `myTTT::Display()' ,就是说‘myTTT::Display()' 重复定义了。我不知道为什么。如果把myTTT::Display()的定义从newh.h文件中移到newfun.cpp中,就可以编译成功。

不要问我为什么要放一个空文件newfun.cpp在这儿。我这么做这是为了测试。我上网找了好长时间也没找到答案,希望能有大侠指教。
...全文
98 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyadong 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 brokenspoon 的回复:]
引用 7 楼 wangyadong 的回复:

引用 5 楼 brokenspoon 的回复:
难道一定要把myClass::Display()的定义放到一个.cpp文件里面,然后把这个cpp文件也包含到这个工程里面来?
如果是这样的,那么像那些#include  <cmath>, 还有string等为什么只用包含头文件?

string的机制和这里的不一样,string 说白了不是一个类,二是一个模板,和这里的类定义是不一样的,而且模板类不支持定义和声明分离


那就是说我必须得另外写一个cpp…
[/Quote]
呵呵 不是说必须,这是一种良好的编程习惯,如果你只是一次包含的话,就不会重复定义,如果你不能保证只include一次,那你就要分开写,事实上你是很难保证的,所以 你还是必须分开写!
brokenspoon 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wangyadong 的回复:]
引用 5 楼 brokenspoon 的回复:
难道一定要把myClass::Display()的定义放到一个.cpp文件里面,然后把这个cpp文件也包含到这个工程里面来?
如果是这样的,那么像那些#include <cmath>, 还有string等为什么只用包含头文件?

string的机制和这里的不一样,string 说白了不是一个类,二是一个模板,和这里的类定义是不一样的,而且模板类不支持定义和声明分离
[/Quote]

那就是说我必须得另外写一个cpp文件定义myClass::Display(),然后再把它加到这个工程里?
wangyadong 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 brokenspoon 的回复:]
难道一定要把myClass::Display()的定义放到一个.cpp文件里面,然后把这个cpp文件也包含到这个工程里面来?
如果是这样的,那么像那些#include <cmath>, 还有string等为什么只用包含头文件?
[/Quote]
string的机制和这里的不一样,string 说白了不是一个类,二是一个模板,和这里的类定义是不一样的,而且模板类不支持定义和声明分离
wangyadong 2009-04-08
  • 打赏
  • 举报
回复
#ifndef...#define...#endif这个只能解决重复包含,但无法解决重复定义的。head1.h文件已经包含Display()的定义,所以当其他文件包含#include "head1.h"的时候,就相当于定义了display函数,当两次及以上包含的时候就会告诉你重复定义
brokenspoon 2009-04-08
  • 打赏
  • 举报
回复
难道一定要把myClass::Display()的定义放到一个.cpp文件里面,然后把这个cpp文件也包含到这个工程里面来?
如果是这样的,那么像那些#include <cmath>, 还有string等为什么只用包含头文件?
xqls_xqls 2009-04-08
  • 打赏
  • 举报
回复
newh.h没有必要,还不如不要
brokenspoon 2009-04-08
  • 打赏
  • 举报
回复
实际上我的问题是,比如我有一个数据类型需要经常用到,被不同的程序,所以我定义了一个类,包含在一个头文件里,比如说如下
文件名 head1.h
#ifndef MYHEAD1
#define MYHEAD1

#include <iostream>
using namespace std;
class myClass
{
int a;
public:
void Display();
myClass(){a = 1;}
}

void myClass::Display()
{
cout << "Here you go.\n";
}

#endif

然后我针对每个应用建了一个工程,里面需要用到这个类,所以我又定义了一个头文件head2.h,一个源文件testfun.cpp,一个主程序文件testmain.cpp

head2.h里面定义了一些其他的类,也包含了head1.h,其形式为
#include "head1.h"
#ifndef MYHEAD2
#define MYHEAD2

//程序代码,里面不会重新定义head1.h中的东西,只会用到

#endif

testfun.cpp是对head2.h里面一些函数的定义,也不会重新定义head1.h里面的东西,
其形式为
#include "head2.h"

//程序代码

testmain.cpp是主函数的定义,也不会重新定义head1.h里面的东西,
其形式为
#include "head2.h"

int main()
{
//程序代码
}

这样的程序总是会给出head1.h中myClass::Display()重复定义的错误,这是为什么呢?怎么解决?
wangyadong 2009-04-08
  • 打赏
  • 举报
回复
一个原则:

不分配内存的,放在头文件
分配内存的放在cpp文件,防止重复定义
wangyadong 2009-04-08
  • 打赏
  • 举报
回复
在编译时.h文件里的代码将会被扩展到包含它的.cpp文件里,那么对于newmain.cpp和newfun.cpp在编译的时候都会将其包含的.h文件包含进来,而且是分别包含,这样,display函数的定义被包含了两次,所以会提示定义重复

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧