2013-11-21 3 views
0

Прежде всего, извините за задание такого глупого вопроса. Мне просто интересно, и мне было любопытно узнать почему. У меня есть базовый класс с виртуальным деструктора объявить в Base.hПочему имя файла CPP должно совпадать с именем файла H?

#ifndef BASE_H_ 
#define BASE_H_ 

class Base { 
public: 
    Base(); 
    virtual ~Base(); 
}; 
#endif 

А то у меня есть дочерний класс, унаследованный класс Base декларировать Child.h

#ifndef CHILD_H_ 
#define CHILD_H_ 

#include "base.h" 
class Child : public Base { // (1) 
    public: 
     Child(); 
}; 
#endif 

Теперь сделайте main.cpp и положить в реализация виртуального деструктора класса Base.

#include "Base.h" 

Base::Base() {} 
Base::~Base() {} 

Исходный код был составлен с использованием Eclipse, C++ Kepler в Ubuntu 13.04. Существует недоразумение, что undefined reference to 'Base::Base()' на (1). Если I измените main.cpp на Base.cpp, ошибка исчезнет.

Могу ли я узнать, почему это могло случиться? Это связано с конфигурацией в Eclipse? Если да, могу ли я отключить эту функцию? Или это из-за лучших методов программирования, так что исходный код гораздо более управляемый? Или это спецификация C++?

ответ

1

В стандарте нет спецификации, что это не должно работать, и я не думаю, что eclipse обеспечивает выполнение этого макета. Это действительно более управляемо и распространено, но отнюдь не требование.

Вы, вероятно, не добавили main.cpp к сборке, и он не компилируется.

+1

Кроме того, если вы используете несколько исходных файлов для реализации класса, такое ограничение невозможно встретить. –

1

У этого есть ничего, чтобы сделать с спецификацией C++. Это должно быть в Eclipse, возможно, в make-файле. Вы всегда можете разложить простую одиночную линию для запуска из main.cpp (вместе с #include), чтобы сохранить ее и поместить в Base.cpp.

Смежные вопросы