多文件编译的问题

sjyzhxw 2011-10-09 11:47:06
main.cpp

#include"functions.h"
void welcome()
{
system("cls");
int choose;
cout<<"欢迎使用网址收藏管理器"<<endl;
cout<<"请选择功能:"<<endl;
cout<<"1.创建收藏"<<endl;
cout<<"2.打开收藏"<<endl;
cout<<"3.退出"<<endl;
cout<<"请选择:";
cin>>choose;
switch(choose)
{
case 1:
system("cls");
create_collection();
break;
case 2:
system("cls");
open_collection();
break;
case 3:
system("cls");
break;
default:
system("cls");
welcome();
break;
}
}
int create_collection()
{
vector<URL> u;
cout<<"开始创建收藏文件:"<<endl;
cout<<"请依次输入名称,网址,类别(每项以空格隔开,每个记录为一行):"<<endl;
string name,add,cate;
while(cin>>name>>add>>cate)
{
URL u_temp(name,add,cate);
u.push_back(u_temp);
}
cin.clear();
int choose;
cout<<"请选择接下来的操作:"<<endl;
cout<<"1.保存收藏记录到文件"<<endl;
cout<<"2.按分类进行查询"<<endl;
cout<<"3.其它任意键返回主菜单"<<endl;
cin>>choose;
switch(choose)
{
case 1:
save_collection_to_file(u);
break;
case 2:
shown_by_cate(u);
break;
default:
welcome();
break;
}
return 0;
}
void shown_by_cate(const vector<URL> &rhs)
{
string cate;
cout<<"请输入要查询的分类:";
cin>>cate;
cout<<"* * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
int cnt=0;
for(vector<URL>::const_iterator it=rhs.begin();it!=rhs.end();++it)
{
if(it->getcate()==cate)
{
it->show_without_cate();
cout<<"------------------------------------------------------"<<endl;
cnt++;
}
}
if(cnt)
{
cout<<"分类为"<<cate<<"的共有以上"<<cnt<<"条记录:"<<endl;
cout<<"* * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
}
else
{
cout<<"分类为"<<cate<<"的记录为空!"<<endl;
cout<<"* * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
}
cout<<"1.继续查询"<<endl;
cout<<"2.其它任意键返回主菜单"<<endl;
cout<<"请选择:";
int choose;
cin>>choose;
switch(choose)
{
case 1:
shown_by_cate(rhs);
break;
default:
welcome();
break;
}
}
int save_collection_to_file(const vector<URL> &rhs)
{

string filename;
cout<<"请输入文件名:"<<endl;
cin>>filename;
filename+=".txt";
ofstream outfile(filename.c_str());
if(!outfile)
{
cerr<<"打开文件错误!"<<endl;
return -1;
}
for(vector<URL>::const_iterator it=rhs.begin();it!=rhs.end();++it)
outfile<<it->getname()<<" "<<it->getadd()<<" "<<it->getcate()<<endl;
cout<<"保存成功!按任意键返回主菜单"<<endl;
system("pause");
welcome();
return 0;
}
void open_collection()
{
vector<URL> u;
open_collection_from_file(u);
}
int open_collection_from_file(vector<URL> &rhs)
{
string filename;
cout<<"请输入文件名:"<<endl;
cin>>filename;
filename+=".txt";
ifstream infile(filename.c_str());
if(!infile)
{
cerr<<"打开文件错误!"<<endl;
return -1;
}
while(!infile.eof())
{
string name,add,cate;
infile>>name>>add>>cate;
URL u_temp(name,add,cate);
rhs.push_back(u_temp);
}
cout<<"读取成功!"<<endl;
cout<<"1.按分类查询"<<endl;
cout<<"2.排序"<<endl;
cout<<"3.其他任意键返回主菜单"<<endl;
cout<<"请选择接下来的操作:"<<endl;
int choose;
cin>>choose;
switch(choose)
{
case 1:
shown_by_cate(rhs);
break;
case 2:
//排序
break;
default:
welcome();
break;
}
return 0;
}

int main()
{
welcome();
return 0;
}

如何把main函数上面的函数定义单独写在一个functions.cpp里面?

#include"functions.h"
void welcome()
{
system("cls");
int choose;
cout<<"欢迎使用网址收藏管理器"<<endl;
cout<<"请选择功能:"<<endl;
cout<<"1.创建收藏"<<endl;
cout<<"2.打开收藏"<<endl;
cout<<"3.退出"<<endl;
cout<<"请选择:";
cin>>choose;
switch(choose)
{
case 1:
system("cls");
create_collection();
break;
case 2:
system("cls");
open_collection();
break;
case 3:
system("cls");
break;
default:
system("cls");
welcome();
break;
}
}
int create_collection()
{
vector<URL> u;
cout<<"开始创建收藏文件:"<<endl;
cout<<"请依次输入名称,网址,类别(每项以空格隔开,每个记录为一行):"<<endl;
string name,add,cate;
while(cin>>name>>add>>cate)
{
URL u_temp(name,add,cate);
u.push_back(u_temp);
}
cin.clear();
int choose;
cout<<"请选择接下来的操作:"<<endl;
cout<<"1.保存收藏记录到文件"<<endl;
cout<<"2.按分类进行查询"<<endl;
cout<<"3.其它任意键返回主菜单"<<endl;
cin>>choose;
switch(choose)
{
case 1:
save_collection_to_file(u);
break;
case 2:
shown_by_cate(u);
break;
default:
welcome();
break;
}
return 0;
}
void shown_by_cate(const vector<URL> &rhs)
{
string cate;
cout<<"请输入要查询的分类:";
cin>>cate;
cout<<"* * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
int cnt=0;
for(vector<URL>::const_iterator it=rhs.begin();it!=rhs.end();++it)
{
if(it->getcate()==cate)
{
it->show_without_cate();
cout<<"------------------------------------------------------"<<endl;
cnt++;
}
}
if(cnt)
{
cout<<"分类为"<<cate<<"的共有以上"<<cnt<<"条记录:"<<endl;
cout<<"* * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
}
else
{
cout<<"分类为"<<cate<<"的记录为空!"<<endl;
cout<<"* * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
}
cout<<"1.继续查询"<<endl;
cout<<"2.其它任意键返回主菜单"<<endl;
cout<<"请选择:";
int choose;
cin>>choose;
switch(choose)
{
case 1:
shown_by_cate(rhs);
break;
default:
welcome();
break;
}
}
int save_collection_to_file(const vector<URL> &rhs)
{

string filename;
cout<<"请输入文件名:"<<endl;
cin>>filename;
filename+=".txt";
ofstream outfile(filename.c_str());
if(!outfile)
{
cerr<<"打开文件错误!"<<endl;
return -1;
}
for(vector<URL>::const_iterator it=rhs.begin();it!=rhs.end();++it)
outfile<<it->getname()<<" "<<it->getadd()<<" "<<it->getcate()<<endl;
cout<<"保存成功!按任意键返回主菜单"<<endl;
system("pause");
welcome();
return 0;
}
void open_collection()
{
vector<URL> u;
open_collection_from_file(u);
}
int open_collection_from_file(vector<URL> &rhs)
{
string filename;
cout<<"请输入文件名:"<<endl;
cin>>filename;
filename+=".txt";
ifstream infile(filename.c_str());
if(!infile)
{
cerr<<"打开文件错误!"<<endl;
return -1;
}
while(!infile.eof())
{
string name,add,cate;
infile>>name>>add>>cate;
URL u_temp(name,add,cate);
rhs.push_back(u_temp);
}
cout<<"读取成功!"<<endl;
cout<<"1.按分类查询"<<endl;
cout<<"2.排序"<<endl;
cout<<"3.其他任意键返回主菜单"<<endl;
cout<<"请选择接下来的操作:"<<endl;
int choose;
cin>>choose;
switch(choose)
{
case 1:
shown_by_cate(rhs);
break;
case 2:
//排序
break;
default:
welcome();
break;
}
return 0;
}

这样的话报错:
1>main.obj : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall URL::getname(void)const " (?getname@URL@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) 已经在 functions.obj 中定义
1>main.obj : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall URL::getadd(void)const " (?getadd@URL@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) 已经在 functions.obj 中定义
1>main.obj : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall URL::getcate(void)const " (?getcate@URL@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) 已经在 functions.obj 中定义
1>main.obj : error LNK2005: "public: void __thiscall URL::show_all(void)const " (?show_all@URL@@QBEXXZ) 已经在 functions.obj 中定义
1>main.obj : error LNK2005: "public: void __thiscall URL::show_without_cate(void)const " (?show_without_cate@URL@@QBEXXZ) 已经在 functions.obj 中定义
1>main.obj : error LNK2005: "void __cdecl welcome(void)" (?welcome@@YAXXZ) 已经在 functions.obj 中定义
1>main.obj : error LNK2005: "int __cdecl create_collection(void)" (?create_collection@@YAHXZ) 已经在 functions.obj 中定义
1>main.obj : error LNK2005: "void __cdecl shown_by_cate(class std::vector<class URL,class std::allocator<class URL> > const &)" (?shown_by_cate@@YAXABV?$vector@VURL@@V?$allocator@VURL@@@std@@@std@@@Z) 已经在 functions.obj 中定义
1>main.obj : error LNK2005: "int __cdecl save_collection_to_file(class std::vector<class URL,class std::allocator<class URL> > const &)" (?save_collection_to_file@@YAHABV?$vector@VURL@@V?$allocator@VURL@@@std@@@std@@@Z) 已经在 functions.obj 中定义
1>main.obj : error LNK2005: "void __cdecl open_collection(void)" (?open_collection@@YAXXZ) 已经在 functions.obj 中定义
1>main.obj : error LNK2005: "int __cdecl open_collection_from_file(class std::vector<class URL,class std::allocator<class URL> > &)" (?open_collection_from_file@@YAHAAV?$vector@VURL@@V?$allocator@VURL@@@std@@@std@@@Z) 已经在 functions.obj 中定义
1>F:\visual studio 2010\projecs\URL_management\Debug\URL_management.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
1>
1>生成失败。
...全文
188 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Roy_Smiling 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mengmingtao 的回复:]

为所有头文件定义一个
#ifndef HEADER_FILE_NAME
#define HEADER_FILE_NAME
//your code
#endif

防止重复声明~

在实现文件和使用该头文件的文件中包含头文件即可
[/Quote]
+++
我要戒烟了 2011-10-10
  • 打赏
  • 举报
回复
每个.h文件加ls的方法可以,也可以在每个.h文件的第一行加#pragma once
sjyzhxw 2011-10-10
  • 打赏
  • 举报
回复
我知道为什么自己错了。
我把类的函数定义也放在了H文件里。

但是当我把定义单独放到一个cpp里面的时候,即使不用条件编译也可以通过了。为什么。。。?
only_lonely 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 inzaghi97 的回复:]

每个.h文件加ls的方法可以,也可以在每个.h文件的第一行加#pragma once
[/Quote]
是的。就是这样。
mengmingtao 2011-10-09
  • 打赏
  • 举报
回复
为所有头文件定义一个
#ifndef HEADER_FILE_NAME
#define HEADER_FILE_NAME
//your code
#endif

防止重复声明~

在实现文件和使用该头文件的文件中包含头文件即可

64,691

社区成员

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

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