Ошибка переопределения с несколькими производными классами в главном - PullRequest
2 голосов
/ 27 февраля 2012

У меня есть базовый класс Object, и у меня есть несколько производных классов с именами Item, Person и Location.

Поскольку каждый из них является производным от Object, мне нужно включить Object.h в каждый их заголовокфайлы, и я включаю все производные классы в свой основной.

Поскольку я делаю это, я получаю ошибку переопределения.

Я хочу знать, как правильно включить эти файлы, чтобы избежать этой ошибки?

Спасибо!

РЕДАКТИРОВАТЬ:

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

main.cpp

#include <iostream>
#include <string>

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


using namespace std;

int main(){
    return 0;
}

Ответы [ 3 ]

6 голосов
/ 27 февраля 2012

Странно, все, кого я встречал, сталкивающиеся с этой проблемой, не имеют ни малейшего представления о том, что происходит, и вы правильно проанализировали проблему.

Прочитайте это: http://en.wikipedia.org/wiki/Include_guard

5 голосов
/ 27 февраля 2012

Вы должны добавить охранники для ваших заголовков.Это предотвращает включение заголовков дважды.Например, в верхней части заголовка Object.h вы должны поместить

#ifndef _OBJECT_H
#define _OBJECT_H

, а затем завершить заголовок с помощью

#endif

Если заголовок уже былвключен текст между #ifndef и #endif.

4 голосов
/ 27 февраля 2012

Если вы еще не получили их на месте, вам нужно поместить включить охрану в заголовочные файлы, чтобы предотвратить включение одних и тех же файлов несколько раз (что приведет к переопределению классов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...