2014-01-14 5 views
4

Я новичок в программировании на C++ и борюсь с организацией моего проекта. У меня есть класс с именем StateManager, который имеет файл заголовка и файл cpp. cpp содержит все реализации.Где поставить класс интерфейса в C++

Если теперь я хочу, чтобы класс интерфейса:

class IStateManager 
{ 
    public: 
     virtual ~IStateManager() {} 
     virtual void SomeMethod {} 
}; 

Я знаю, интерфейсы реально не существуют, как они это делают в C# или Java, но я хочу несколько классов наследовать от этого «интерфейса».

Имеет ли этот класс также заголовок и файл cpp? Или я могу просто поместить его в файл заголовка?

+1

Интерфейс должен иметь только заголовок, поскольку он не имеет реализации. Он может входить в заголовок сам по себе или в другой более крупный файл заголовка. (здесь нет ограничений, таких как Java) –

+1

@ebyrob: Эти методы не объявляются чистыми виртуальными. –

+0

Компилятор C++ не компилирует заголовочные файлы. Единицы компиляции всегда являются CPP-файлами. Если ваш заголовок (потому что это _interface_) будет включен где-то cpp, вам не нужен пустой cpp для него. Тем не менее, если вы говорите об интерфейсах ... Я бы сделал эти методы чистыми (вместо пустой реализации). –

ответ

4

Технически, C++ не имеет интерфейсов. Тем не менее, можно «создавать» интерфейсы посредством множественного наследования (или одиночного наследования, если ваш класс является «базовым» классом и не нуждается в наследовании от нескольких классов). Где ваш «интерфейс» живет полностью зависит от вас. Но если вы планируете использовать класс в качестве интерфейса (без какой-либо реальной реализации, потому что технически интерфейс не имеет реализации до тех пор, пока функции не будут определены в подклассе), я бы поместил его в собственный заголовочный файл и объявил каждый функция чисто виртуальная:

class IStateManager 
{ 
    public: 
     virtual ~IStateManager() {} 
     virtual void SomeMethod() = 0; 
     virtual void AnotherMethod() = 0; 
}; 

class TheState : public IStateManager, public SomeOtherParentClass 
{ 
    virtual void SomeMethod(); // Defined in this class 
    virtual void AnotherMethod(); // Also defined in this class 
    //.. 
}; 

Если вы определяете некоторую реализацию в .cpp для IStateManager класса, то у вас действительно есть более абстрактный класс, а не интерфейс.

Итак, в заключение я говорю: Любая реализация интерфейса «» должна быть определена в .cpp-файле его класса реализации. И если вы планируете использовать интерфейс в нескольких файлах, я бы создал для него отдельный файл .h.

0

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

Я бы не назвал это интерфейсом, кстати, потому что ваши методы virtual не являются чистыми.

+0

Я знаю, что интерфейсы действительно не существуют, как в C# или Java, но я хочу, чтобы несколько классов наследовали от этого «интерфейса». Так что я хочу, чтобы он был изолирован от других файлов, или я пропущу вашу мысль? –

+2

Я, конечно, не создавал .cpp-файл, просто чтобы сохранить пару наборов пустых фигурных скобок '{}'. (Хотя «как мне создать интерфейс на C++», безусловно, связан с вопросом, который напрямую не задавался) –

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