поэтому я пытаюсь создать класс с помощью вспомогательного метода, а именно:
class Type{
int a, b, c;
friend auto helper(auto);
friend auto test_helper(auto);
/* couples test with implement */
public:
void method(){
helper(this);
}
};
Но делая helper
функция друга соединяет тест с реализацией, если мы хотим проверить helper
,
Итак, я хочу сделать helper
свободная функция, а именно:
auto helper(int&,int&,int&);
auto test_helper(int&,int&,int&);
class Type{
int a, b, c;
public:
void method(){
helper(a,b,c);
}
};
Это, однако, делает код намного более утомительным, когда членов данных много. Итак, у меня возникла идея построить вспомогательную структуру, которая имеет точный элемент данных в виде Type
но все члены данных являются открытыми, так что мы сможем просто передать дескриптор такого HelperType
может быть что-то вроде:
struct HelperType{
int a, b, c;
};
auto helper(HelperType* a);
auto test_helper(HelperType* a);
void Type::method(){
helper(static_cast<HelperType*>(this));
}
Есть ли изящные подходы к построению таких HelperType
структура? Такие, как универсальная оболочка или, возможно, с наследованием?
У меня нет простого решения для создания HelperType
от Type
(единственное, что приходит на ум, это тяжелое метапрограммирование или использование макросов). Однако здание Type
от HelperType
было бы довольно тривиально, используя private
наследование. От Производный класс (cppreference.com):
Когда класс использует спецификатор доступа к закрытому члену для получения из базы, все открытые и защищенные члены базового класса доступны как частные члены производного класса.
// Could be renamed "TypePrivateMembers" or "TypeData"struct HelperType{
int a, b, c;
};
auto helper(HelperType* a);
class Type : private HelperType {
public:
// a,b,c can be accessed in Type class scope.
void method(){
helper(this);
}
};
Тем не менее, все еще из cppreference (выделение мое):
Частное наследование также можно использовать для реализации отношений композиции (подобъект базового класса является подробностью реализации объекта производного класса). Использование члена обеспечивает лучшую инкапсуляцию и обычно является предпочтительным если производный класс не требует доступа к защищенным элементам (включая конструкторы) базы, не нуждается в переопределении виртуального члена базы, не требует, чтобы база была построена до и уничтожена после какого-либо другого базового подобъекта, не нуждается в совместном использовании виртуальной базы или потребностей контролировать построение виртуальной базы. […]
Это повторяющийся состав по наследству дебаты. Этот вопрос уже задавался много раз на StackOverflow, вот несколько интересных ссылок по теме (в общем & для этого конкретного случая):
Других решений пока нет …