【问题标题】:Redefinition error with multiple derived classes in the main主类中的多个派生类的重新定义错误
【发布时间】:2012-03-16 11:02:15
【问题描述】:

我有一个 Object 基类,还有几个派生类,分别称为 Item、Person 和 Location。

因为这些都是从 Object 派生的,所以我需要在它们的每个头文件中包含 Object.h,并且我在我的 main 中包含所有派生类。

因为我正在这样做,所以我收到了重新定义错误。

我想知道包含这些文件以避免此错误的正确方法是什么?

谢谢!

编辑:

object.h

using namespace std;

class Object{
    string name;
    string description;

    public:
        Object();
        Object(string name, string description);
        void set_name(string name);
        void set_description(string description);
        string get_name();
        string get_description();
        ~Object();
};

item.h

using namespace std;

#include "object.h"

class Item : public Object{
    public:
        Item();
        Item(string name, string description);

};

locale.h

using namespace std;

#include "object.h"

class Locale : public Object{
    public:
        Locale();
        Locale(string name, string description);
};

ma​​in.cpp

#include <iostream>
#include <string>

#include "locale.h"
#include "item.h"


using namespace std;

int main(){
    return 0;
}

【问题讨论】:

  • exact 错误信息是什么?请展示您的代码的(简化)版本。
  • 确切的错误信息是“重新定义对象”
  • 好的,你需要展示一些代码。首先查看sscce.org(这是关于将您的代码简化为堆栈溢出的最佳格式)。
  • 我知道是什么导致了错误。 object.h 被定义了两次。我想知道在这种情况下包含头文件的正确格式是什么。
  • 请不要在头文件中导入命名空间 - 这是一个相当有侵略性的事情,每个包含该头文件的文件都会自动导入整个命名空间。

标签: c++ header-files redefinition


【解决方案1】:

奇怪,我遇到的每个遇到这个问题的人都不知道发生了什么,而且你已经正确地分析了这个问题。

阅读: http://en.wikipedia.org/wiki/Include_guard

【讨论】:

  • 正是我需要的。谢谢!
【解决方案2】:

如果您还没有准备好它们,则需要将include guards 放入头文件中,以防止多次包含相同的文件(这将重新定义类)。

【讨论】:

    【解决方案3】:

    您应该在标题中添加包含防护。这可以防止标题被包含两次。例如,在 Object.h 标头的顶部,您可以放置​​,

    #ifndef _OBJECT_H
    #define _OBJECT_H
    

    然后你以,结束标题,

    #endif
    

    如果已经包含了标题,则删除#ifndef#endif 之间的文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 2014-02-19
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多