多重定义:链接时出错 [英] multiple definition: error at link time
问题描述
我正在为C ++入门书中的复制控制成员练习编写一些类.
I'm writing a couple of classes for an exercise on copy control members in the C++ primer book.
我将类定义放在各自的头文件中,并将实现放在代码文件中.我似乎已经完成了应做的所有事情,但是在无法理解的链接时间出现了一个错误(并且我已经花了半个小时的时间来思考它)
I put the classes definitions in their respective header files,and implementation in code files. I seem to have done all things like they should be done, but I get an error at link time I can't understand (and I already spent half an hour thinking about it)
这是消息类(标题和代码文件)
here's the message class (headers and code files)
message.h
#include <string>
#include "folder.h"
class message {
friend void swap(message&,message&);
public:
explicit
message(const std::string& =std::string());
// copy control
message(const message&);
~message();
message &operator=(const message&);
// interface
void save(folder&);
void remove(folder&);
private:
// data members
std::string text;
std::set<folder*> folders;
// utility functions
void add_to_folders(const message&);
void remove_from_folders();
};
void swap(message &m1,message &m2)
{
swap(m1.text,m2.text);
swap(m1.folders,m2.folders);
}
message.cpp
#include "message.h"
message::message(const std::string &t) : text(t) {}
message::message(const message &other) : text(other.text),folders(other.folders)
{
add_to_folders(other);
}
message::~message()
{
remove_from_folders();
}
message& message::operator=(const message &other)
{
remove_from_folders();
text=other.text;
folders=other.folders;
add_to_folders(other);
return *this;
}
void message::save(folder &f)
{
folders.insert(&f);
f.addMsg(this);
}
void message::remove(folder &f)
{
folders.erase(&f);
f.remMsg(this);
}
void message::add_to_folders(const message& m)
{
for (auto i:m.folders)
i->addMsg(this);
}
void message::remove_from_folders()
{
for (auto i:folders)
i->remMsg(this);
folders.clear();
}
这是文件夹类
folder.h
#include <set>
class message;
class folder {
public:
/*folder();
folder(const folder&);
~folder();
folder &operator=(const folder&);*/
void addMsg(message*);
void remMsg(message*);
private:
std::set<message*> messages;
};
folder.cpp
#include "folder.h"
void folder::addMsg(message *m)
{
messages.insert(m);
}
void folder::remMsg(message *m)
{
messages.erase(m);
}
每条消息都包含指向文件夹的指针的集合,反之亦然.每个文件都可以单独正常编译,但是当我链接三个文件时,我收到一条错误消息,指出重新定义了交换功能(我在消息类标头中定义).
Every message holds a collection of pointer to folders and vice versa. Each file compiles fine separately, but when I link the three of them I get an error saying that the swap function (that I defined in the message class header) is redefined.
main.cpp
#include "message.h"
int main()
{
folder f1;
message m1;
}
我在做什么错了?
推荐答案
您将在message.cpp
和main.cpp
中都包含头文件message.h
.由于您拥有:
You are including the header file message.h
in both message.cpp
and main.cpp
. Since you have:
void swap(message &m1,message &m2)
{
swap(m1.text,m2.text);
swap(m1.folders,m2.folders);
}
在message.h
中,您现在具有在main.cpp
转换单元和message.cpp
转换单元中声明的交换功能.这将导致多定义错误.您需要将swap()
移到message.cpp
In message.h
you now have the swap function declared in both the main.cpp
translation unit and the message.cpp
translation unit. This will cause a multiple definition error. You need to move swap()
into message.cpp
这篇关于多重定义:链接时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!