@Prosciutto
Постигаю

Происходит ли нарушение инкапсуляции, если реализация хранится в .h-файлах?

Столкнулся с проблемой линковки при использовании templates<> для классов. Оказывается, определения функций класса должны описываться в том же .h-файле (.hpp), что, впроем, хоть настоящей реализацией еще и не является, а лишь описанием шаблона будущей реализации, создаваемой динамически, но все же логика программы является открытой для пользователя хэдера. В связи с этим два вопроса:
1) Является ли это нарушением инкапсуляции?
2) Как грамотно организовать код в таком случае? (при использовании шаблонов класса).
  • Вопрос задан
  • 275 просмотров
Решения вопроса 1
@dima20155
you don't choose c++. It chooses you
Нарушением инкапсуляции это довольно сложно назвать, ибо приватные функции все ещё остаются приватными с точки зрения других классов. Сокрываете вы реализацию методов класса от других сущностей в вашем коде, а не от программиста (если я правильно понял причину по которой вы решили, что это нарушение инкапсуляции).
Мне нравится метод организации данного кода следущим образом:

Foo.h
template <typename T>
struct Foo
{
    void doSomething(T param);
};

#include "Foo_impl.h"


Foo_impl.h
template <typename T>
void Foo<T>::doSomething(T param)
{
    //implementation
}


Код украл отсюда
https://stackoverflow.com/questions/495021/why-can...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Xiran
Это даже отдельный вариант оформления кода, header-only называется. Используется повсеместно в Boost.
Никакого отношения к инкапсуляции это не имеет, пользуйтесь на здоровье.
Если захотите объявление спрятать членов обычного класса в .cpp, ознакомитесь с идиомами d-pointer и q-pointer.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы