Как определить интерфейс в C ++? - PullRequest
3 голосов
/ 26 апреля 2011

Я работаю над классом C ++, который предоставляет абстракцию BSD-сокетов для работы в сети. Я хочу определить интерфейс ISocket, который реализуется с помощью CSocket и MockSocket (последний для модульного тестирования). Я знаю, что мне нужно определить методы, которые я хочу реализовать для реализации классов, как чисто виртуальные, т.е.

class ISocket {
public:
  virtual int Socket(int domain, int type, int protocol) = 0;
};

Меня беспокоит, может ли быть создан экземпляр класса типа ISocket. Мои инстинкты говорят мне, что любой класс, по крайней мере с одним чисто виртуальным методом, является абстрактным классом (то есть интерфейсом) и не может быть создан, но в глубине моего сознания я беспокоюсь, что мне нужно что-то сделать с автоматически сгенерированным конструкторы и деструкторы, которые будет предоставлять компилятор C ++ ( Effective C ++ - это и дар - когда вы помните все, что вы читаете в нем, - и проклятие - когда вы этого не делаете).

Правильно ли я делаю это, или есть лучший способ определения интерфейсов в C ++, которому я здесь не следую?

Ответы [ 4 ]

7 голосов
/ 26 апреля 2011

В общем, вы должны объявить деструктор virtual; в противном случае вы попадете в неопределенное поведение, если попытаетесь вызвать delete для указателя на интерфейс. Нет таких проблем с конструкторами.

О, и вы правы, что невозможно создать экземпляр объекта класса с чисто виртуальным.

3 голосов
/ 26 апреля 2011

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

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

2 голосов
/ 26 апреля 2011

Вы правы, считая, что любой класс с чисто виртуальным методом является абстрактным и не может быть создан.

Лично я склонен добавлять защищенный деструктор в большинство моих интерфейсов, как во многих / большинстве случаев, которые я делаюне хочу, чтобы код, использующий интерфейс, мог его уничтожить.В качестве альтернативы вы должны добавить общедоступный виртуальный деструктор (не чистый, с пустым телом!), Чтобы объект можно было удалить с помощью указателя интерфейса, и будут вызваны правильные деструкторы.

2 голосов
/ 26 апреля 2011

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

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