多重定义:链接时的错误

时间:2015-09-10 14:24:27

标签: c++ compilation header redefinition

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

每条消息都包含指向文件夹的指针集合,反之亦然。每个文件分别编译好,但当我链接其中三个时,我得到一个错误,说交换函数(我在消息类头中定义)被重新定义。

的main.cpp

#include "message.h"

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

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的问题的解决方案非常简单:您已在消息类中将void swap(data1,data2)声明为友元函数,然后在* .h文件的底部定义它。从* .h文件中获取实现,并在任何类函数之前将其放入message.cpp文件中。确保在* .cpp文件中的classe构造函数之前有定义(实现),因为类对象将依赖于此交换函数。这应该可以解决构建过程中的问题。是的,3个文件中的每一个都将成功编译,但解决方案将无法构建,因为它无法解析此方法,因为您已在* .h文件中定义它。您还在folder.h文件中使用类原型消息,您还应该在folder.cpp文件中包含#include“message.h”,但这需要您将* .h文件与#ifndef一起使用。 .. #define ... #endif指令。这应该对你有帮助!