Member 12832832 Ответов: 2

Обзор шаблонов C++: использование структур с чистыми виртуальными методами вместо интерфейсов


Я только начал изучать C++, исходя из опыта работы с C# и Java.
Мне нравится использовать интерфейсы в своем коде. В C++, хотя они не существуют, поэтому вместо этого я создаю структуры с чистыми виртуальными методами.

Мои вопросы таковы:

1) из того, что я понимаю, нет никакой разницы между struct и class, кроме метода доступа по умолчанию, но это обычное место, чтобы увидеть struct используется, когда класс имеет меньший размер. Поэтому я решил в качестве соглашения использовать struct при написании интерфейсов, поскольку способ, которым struct рассматривается программистами, больше напоминает интерфейс. Существуют ли какие-либо другие конвенции по этому вопросу, или моя конвенция плоха или может каким-либо образом вызвать путаницу?

2) поскольку интерфейс имеет только чистую виртуальность и не обеспечивает никакой реализации (в большинстве случаев методы по умолчанию теперь являются вещью в Java), я подумал, что было бы логично сделать для него только заголовочный файл, а не создавать как файл .cpp, так и файл .h. Поскольку предполагается, что файл .cpp имеет реализацию, а файл.h должен иметь прототипы методов. Опять же, существуют ли какие-либо другие конвенции по этому вопросу, или моя конвенция плоха или может каким-либо образом вызвать путаницу?

Пример:

ISayHello.х
struct IRender
{
    virtual void render() = 0;
}


ImplementationExample.cpp
class Sprite : public IRender
{
public:
    void render() override
    {
        //code goes here
    }
}


Что я уже пробовал:

Примечание: мое намерение состоит в том, чтобы узнать мнение тех, у кого больше опыта, о том, как работает мой паттерн, есть ли у него проблемы и есть ли какая-либо другая конвенция по этому вопросу, которую рассматривает моя конвенция. Если вы считаете, что вопрос не по теме, я был бы признателен, если бы вы могли перенаправить меня в лучшее место, чтобы задать свой вопрос. Этот вопрос, например, был помечен как не по теме на Code Review Stack Exchange, хотя, на мой взгляд, запрос на проверку шаблона, который вы используете в своем коде, не является не по теме.

[no name]

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

Member 12832832

Тогда ладно. Спасибо за совет.

Richard MacCutchan

Кажется, вполне разумный вопрос. Однако я никогда не использовал такие шаблоны в C++, поэтому не могу действительно высказать свое мнение. Возможно, Вам понравится смотреть на Домашняя страница Бьярне Страуструпа[^], так как он является создателем C++.

Rick York

Я думаю, что это подходящее место для обсуждения вашего кода. Гостиная определенно не место для этого.

Jochen Arndt

Форум C++ действительно может быть лучшим местом для этого, потому что нет единого соглашения, и это скорее дискуссионная тема, чем вопрос, на который можно просто ответить (но здесь он не выходит за рамки темы).

Ответ может заключаться в том, что вы можете делать все, что хотите. В крупных компаниях могут существовать соглашения или правила о том, как писать исходный код C++.

Я использую структуры в C++ только как в C в качестве простых классов хранения данных и использую классы, когда есть функции-члены. Но это мое личное мнение.

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

2 Ответов

Рейтинг:
2

Rick York

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

Что касается того, что «предполагается» содержать в файлах .h и .cpp - это может быть немного. Иногда совсем немного реализации будет в файле заголовка, например, для кода шаблона или классов с большим количеством встроенных методов. Мое общее практическое правило - помещать как можно меньше в файлы заголовков. Это общедоступный интерфейс, общий для модулей, и я стараюсь свести это к минимуму. Например, в наши дни я практически никогда не объявляю классы диалогов в файлах заголовков. Я считаю, что модули, использующие диалоги, действительно не нуждаются в деталях. Все, что им нужно, - это функция интерфейса, которая позволяет им передавать и передавать некоторые данные. Для меня это немного упрощает зависимости и сводит к минимуму компиляцию при изменении кода диалога.


Member 12832832

Спасибо за ваш ответ. Меня особенно интересует, как люди работают в более "корпоративных" средах, таких как Google, Facebook, Ubisoft и т. д...
Я ценю ваш пост и буду повторно публиковать его на дискуссионных форумах.

Рейтинг:
2

Philippe Mori

Нет никаких проблем с вашим кодом.

Однако в C++ вам, возможно, придется рассмотреть вопрос о том, как эти объекты уничтожаются... таким образом, в некоторых случаях может иметь смысл иметь виртуальный пустой деструктор, но он больше не будет "интерфейсом", как в C# или Java.

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

В частности, поскольку C# и Java являются мусором, часто вам не нужно утилизировать свой объект, так как время выполнения автоматически обнаружит в некоторых точках, что объекты больше не используются.

Это приведет к тому, что в C++ возникнет случай, когда вы должны будете каким-то образом правильно удалить исходный объект, в то время как в управляемом языке вам не нужно будет заботиться о том, что объект не содержит ресурс, который необходимо закрыть.