C++,如何在一个cpp文件里使用另一个cpp文件自定义的对象

三叶橄榄 2012-10-15 02:05:34
已定义一个类的头文件MUSIC.h(里面有类的声明和成员函数的定义)
在1.cpp中,定义MUSIC m ;
在2.cpp中,用extern MUSIC m,为什么总是提示什么已重复定义??
(1.cpp中已经#include<MUSIC.h>,2.cpp中没有#include<MUSIC.h>,否则会报错)

而相同的情况,如果
在1.cpp中,定义int a ;
在2.cpp中,声明外部变量extern int a ; 那么编译就可以通过

这是为什么,标准类型的就可以而我们自定义的类用extern MUSIC m ; 就出问题?
求高手解答
...全文
2125 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hqw19881118 2012-10-15
  • 打赏
  • 举报
回复

//文件music.h
#ifndef MUSIC_H
#define MUSIC_H

class Music
{};

#endif
//文件1.cpp
#include "music.h"
using namespace std;

int main(int argc, char* argv[])
{
Music m;
return 0;
}
//文件2.cpp
#include "music.h"
extern class Music m;

完全没有问题啊!
myliupp 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
引用 2 楼 的回复:
引用 1 楼 的回复:

2.cpp中没有#include<MUSIC.h>会报错吧


但是#include<MUSIC.h>之后,又会说
fatal error LNK1169: 找到一个或多个多重定义的符号


头文件中不要:
1, 定义变量
2, 定义函数(内联函数,模板函数除外)
[/Quote]

许多菜鸟(包括我)是用IDE长大的,但对源文件、头文件间的关系,甚至是IDE本身理解得不够(也有书的例子迟迟不讲,或者学的人想当然,老师也不懂等有关),一直觉得源文件必须有main(因为每次都要build兼运行,而非compile),其他要用的函数都得#include进来,整个工程就一个.cpp,余下全是.h。当面对多个.cpp和多个与.cpp同名的.h出现时,菜鸟就晕了,不明白这时它们之间是怎么个关系了。
mujiok2003 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
引用 1 楼 的回复:

2.cpp中没有#include<MUSIC.h>会报错吧


但是#include<MUSIC.h>之后,又会说
fatal error LNK1169: 找到一个或多个多重定义的符号
[/Quote]

头文件中不要:
1, 定义变量
2, 定义函数(内联函数,模板函数除外)

baichi4141 2012-10-15
  • 打赏
  • 举报
回复
类的成员函数代码必须放在一个cpp文件中
如果在h头文件中放了成员函数的执行代码,那就等同于在所有包含它的cpp文件中都写了一遍,因此报错
三叶橄榄 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

你的MUSIC结构体定义在哪里?
将你的MUSIC结构体定义在extern MUSIC m;的前面
[/Quote]

Music是一个类名,已在头文件MUSIC.h中定义

然后已经在1.cpp中定义了一个该类的对象m

现在问题是,我在2.cpp中

#include"MUSIC.h"
extern Music m;

为什么总是出现一大堆(这里只复制一个上来)
error LNK2005: "public: void __thiscall Music::Clear(void)" (?ClearVectorSearch@MusicMap@@QAEXXZ) 已经在 MusicPlayDlg.obj 中定义
xiaoji0507 2012-10-15
  • 打赏
  • 举报
回复
你的MUSIC结构体定义在哪里?
将你的MUSIC结构体定义在extern MUSIC m;的前面
Aist-memory 2012-10-15
  • 打赏
  • 举报
回复
extern MUSIC m 找到一个或多个多重定义的符号? 你可能在头文件其他什么地方多定义了
三叶橄榄 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

C/C++ code
1.h
#ifndef 1_H
#define 1_H
extern extern MUSIC m;
#endif


2.h
#ifndef 2_H
#define 2_H
#include "1.h"
#endif

2.cpp
#include "2.h"
MUSIC m;
[/Quote]

试过了,不行
能不能解释下,为什么用系统内置类型的就没问题,
而用我们自己定义的类就不行
xiaoji0507 2012-10-15
  • 打赏
  • 举报
回复
多了一个extern
xiaoji0507 2012-10-15
  • 打赏
  • 举报
回复
1.h
#ifndef 1_H
#define 1_H
extern extern MUSIC m;
#endif


2.h
#ifndef 2_H
#define 2_H
#include "1.h"
#endif

2.cpp
#include "2.h"
MUSIC m;
三叶橄榄 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

2.cpp中没有#include<MUSIC.h>会报错吧
[/Quote]

但是#include<MUSIC.h>之后,又会说
fatal error LNK1169: 找到一个或多个多重定义的符号
Aist-memory 2012-10-15
  • 打赏
  • 举报
回复
2.cpp中没有#include<MUSIC.h>会报错吧

65,187

社区成员

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

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