多重定义:链接时出错 [英] multiple definition: error at link time

查看:149
本文介绍了多重定义:链接时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为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.cppmain.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆