я недавно видел некоторый код, используя макросы, какДаунсайд этой макро конструкции и возможные альтернативы
#define CONTAINS(Class, Name)\
private:\
std::list<Class> m_##Name##s;\
public:\
void add_##Name(const Class& a_##Name) {\
m_##Name##s.push_back(a_##Name);\
}\
int get_##Name(int pos) {\
return m_##Name##s.at(pos);\
}\
// ... more member functions
Позже вы можете объявить класс как
class my_class {
CONTAINS(int, integer)
// ...
};
и написать
my_class a(...);
a.add_integer(10);
I был озадачен этим пастом в макро-стиле, потому что мне не хватает конкретных контр-аргументов. Но кроме того, что я принимаю следующие плюсы
- вы можете легко добавить интерфейс списка для произвольных типов в классе
- вы избежите часто повторяющегося кода
- у вас есть простой в использовании интерфейс (как
add_integer(10)
)
Теперь я ищу альтернативы, которые соответствуют всем этим пунктам выше и избегают этого старого стиля макросов C. Моя первая мысль была создать абстрактный шаблон базового класса
template<typename T>
class list_interface {
private:
std::list<T> m_list;
public:
void add_element(const T& x) {
m_list.push_back(x);
}
// ... more member functions
};
и добавить его в класс через наследование как этот
class my_class : public list_interface<int> {
// ...
};
Теперь я могу писать слишком
my_class a;
a.add_element(10);
, но я м касается следующих пунктов:
- Вы можете добавить только один список вашего класса
- вы публично наследуетесь от класса без виртуального деструктора
- я не соответствую третьей точке профи (
add_element(10)
вместоadd_integer(10)
)
Моих вопросов являются:
- Каковы недостатки старого C макро конструкции
- Как я могу обеспечить аналогичные функциональные возможности без макросов
Вам нужен виртуальный деструктор, только если вы вызываете разрушение от базового класса (обычно через 'Base * р ; delete p; '). Вы можете запретить это, создав Constructor, Copy Constructor, Assignment Operator и Destructor 'protected'. Таким образом, очевидно, что базовый класс не предназначен для родословности ... но, конечно, это противоречит философии «наследования» публичного наследования ... –