gpt4 book ai didi

c++ - 多重定义 : error at link time

转载 作者:行者123 更新时间:2023-11-27 22:56:31 25 4
gpt4 key购买 nike

我正在为 C++ 入门书中的复制控制成员的练习编写几个类。

我将类定义放在它们各自的头文件中,并将实现放在代码文件中。我似乎已经做了所有应该做的事情,但是我在链接时出错我无法理解(我已经花了半个小时思考它)

这是消息类( header 和代码文件)

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);
}

消息.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;

};

文件夹.cpp

#include "folder.h"

void folder::addMsg(message *m)
{
messages.insert(m);
}

void folder::remMsg(message *m)
{
messages.erase(m);
}

每条消息都包含一组指向文件夹的指针,反之亦然。每个文件单独编译都很好,但是当我链接它们三个时,我收到一条错误消息,指出交换函数(我在消息类 header 中定义的)被重新定义。

main.cpp

#include "message.h"

int main()
{
folder f1;
message m1;
}

我做错了什么?

最佳答案

您在 message.cppmain.cpp 中都包含了头文件 message.h。因为你有:

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

关于c++ - 多重定义 : error at link time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32504570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com