Я пишу пару классов для упражнений по элементам управления копированием в учебнике по программированию на C++.множественное определение: ошибка во время связи
Я поместил определения классов в соответствующие файлы заголовков и реализацию в файлах кода. Кажется, я все сделал так, как будто это должно быть сделано, но я получаю сообщение об ошибке во время соединения, которое я не могу понять (и я уже потратил полчаса, думая об этом)
вот класс сообщения (заголовки и код файлы)
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);
}
Каждое сообщение содержит коллекцию указателя к папкам и наоборот. Каждый файл компилируется отлично, но когда я связываю три из них, я получаю сообщение о том, что функция swap (которую я определила в заголовке класса сообщения) переопределена.
main.cpp
#include "message.h"
int main()
{
folder f1;
message m1;
}
Что я делаю неправильно?
Пожалуйста, поставьте полный журнал ошибок компилятора/компоновщика. – anorm