Dev C++ 编译时提示 multiple definition of `Test::Test()' 不知道是怎么回事

撸过才知道 2009-02-20 02:11:52
编译时提示 multiple definition of `Test::Test()'
应该是有多重定义了吧,但是在test.cpp 里在Test::Test()前面加上inline就可以编译成功
请教一下这是什么原因

test.cpp 里的代码为:

#include <iostream>
class Test
{
public:
Test();
};
Test::Test()
{
std::cout<<"Test created!";
}

main.cpp里的代码为:

#include <cstdlib>

#include "test.cpp"
using namespace std;

int main(int argc, char *argv[])
{
system("PAUSE");
return EXIT_SUCCESS;
}



...全文
770 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dankee 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 waizqfor 的回复:]
引用楼主 apei2003 的帖子:
编译时提示 multiple definition of `Test::Test()'
应该是有多重定义了吧,但是在test.cpp 里在Test::Test()前面加上inline就可以编译成功
请教一下这是什么原因

test.cpp 里的代码为:

#include <iostream>
class Test
{
public:
  Test();
};
Test::Test()
{
  std::cout < <"Test created!";
}

main.cpp里的代码为:

#include <cstdlib>

#include "test.cpp"
using namespace std;…

应该跟你的inline函数没关系  LZ是不是工程建立有问题啊
文件在一个工程里吗
[/Quote]

我也遇到了相似的问题, 现在还没弄明白是什么问题. 这位仁兄能说详细点儿吗?
撸过才知道 2009-02-26
  • 打赏
  • 举报
回复
因为test.cpp本身作为源文件被编译成obj了 main.cpp包含了test.cpp,所以它的obj里面就有test.obj里面的所有东西..
撸过才知道 2009-02-23
  • 打赏
  • 举报
回复
有人能告诉我一下,这个是怎么回事吗? 我知道写在main.cpp可以,但我想把类写成一个单独的文件
撸过才知道 2009-02-23
  • 打赏
  • 举报
回复
但是我这个工程里就这两个文件,main.cpp和test.cpp,
只main.cpp里有一个#include "test.cpp",并没有被多个文件包含啊
疯哥哥 2009-02-23
  • 打赏
  • 举报
回复
嗯,跟inline有关,原因是你这个cpp被多个文件包含了,所以编译后,生成的不同的二进制obj里面,各有一个Test::Test(),连接时就有多份.
inline的话就二进制代码里面根本没有Test::Test()这样的符号,因为编译时就被原地展开了...
这是最基本的道理.
把类写成单独文件?很遗憾,需要单独成两个文件.
所以建议把类声明放在.h文件里,类的实现放在.cpp文件里....这也是一般最基本的做法.
比如你建了一个类classA,就在工程里面添加两个文件classA.h和classA.cpp
.h文件包含了类声明,这样其他文件就可以使用classA了.
pengzhixi 2009-02-23
  • 打赏
  • 举报
回复
test.h里面放test类的声明
test.cpp里面放test类成员函数的定义记得开头用#include"test.h"
main.cpp的开头也用#include"test.h"就OK了
撸过才知道 2009-02-23
  • 打赏
  • 举报
回复
哦, 是这样
确实,把test.cpp改成test.h以后就可以编译通过了
同一工程下的多个cpp文件中的全局函数冲突,能再解释的清楚一点吗?就以这个为例子,比方说是在编译到哪儿的时候就出现冲突了,而main.cpp里的Test类是怎么和test.cpp的产生冲突的,辛苦了,呵呵

此为main.cpp的代码:
#include <cstdlib>
#include <iostream>

#include "test.h"

using namespace std;

int main(int argc, char *argv[])
{
Test t;
system("PAUSE");
return EXIT_SUCCESS;
}
liuhongyuye 2009-02-23
  • 打赏
  • 举报
回复
同一工程下的多个cpp文件中的全局函数冲突,添加test.h文件,将类的声明放入.h中,然后include "test.h"即可。
herman~~ 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hai040 的回复:]
把test.cpp从工程里删掉
或者把
#include "test.cpp"改成
class Test
{
public:
Test();
};
[/Quote]

UP
撸过才知道 2009-02-20
  • 打赏
  • 举报
回复
我现在就是想把类做成一个个独立的文件,不放在main.cpp里

工程选的是Console Applicaition,文件是在一个工程里的

而且把这个构造函数放在类声明里就可以编译通过,放到外面就不可以,好像是只支持内联函数

这个会不会是我的Dev-c++的设置有问题啊,我从网上下下来也没改什么设置啊

PS 这个机器安装不了vs2005
waizqfor 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 apei2003 的帖子:]
编译时提示 multiple definition of `Test::Test()'
应该是有多重定义了吧,但是在test.cpp 里在Test::Test()前面加上inline就可以编译成功
请教一下这是什么原因

test.cpp 里的代码为:

#include <iostream>
class Test
{
public:
Test();
};
Test::Test()
{
std::cout < <"Test created!";
}

main.cpp里的代码为:

#include <cstdlib>

#include "test.cpp"
using namespace std;…
[/Quote]
应该跟你的inline函数没关系 LZ是不是工程建立有问题啊
文件在一个工程里吗
tangshuiling 2009-02-20
  • 打赏
  • 举报
回复

应该不会有什么问题,跟inline没关系!
vs2005编译通过
hai040 2009-02-20
  • 打赏
  • 举报
回复
把test.cpp从工程里删掉
或者把
#include "test.cpp"改成
class Test
{
public:
Test();
};

64,639

社区成员

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

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