Как добавить метод в класс (вспомогательная функция)?
Как я могу добавить свой собственный метод в уже существующий класс без каких-либо изменений в контексте ранее существовавшего класса.
например:
A.hpp
class A
{
public :
void print1()
{
cout << "print1";
}
};
B.hpp
//add a helper function to class A
//for example:
A::print2()
{
cout << "print2";
}
main.cpp
#include "A.hpp"
#include "B.hpp"
main()
{
A a1;
a1.print2();
}
1 ответ
Чтобы расширить класс в C++, выделите два случая.
Если новая функция может быть выражена в терминах текущего интерфейса, используйте функции, не являющиеся членами
// B.hpp
void print2(A const& a)
{
// pre-call extensions (logging, checking etc.)
a.print1();
// post-call extensions (logging, checking etc.)
}
Если новая функция требует знаний о текущей реализации, используйте наследование классов
// B.hpp
// WARNING: here be dragons, read on before using this in production code
class B: public A
{
public:
void print2() const // compiler-generated signature: void print2(B const*)
{
// pre-call extensions (logging, checking etc.)
print1();
// post-call extensions (logging, checking etc.)
}
};
Однако выход из класса, который не был задуман как базовый, может быть опасным. В частности, если A
не имеет virtual
деструктор, вы можете попасть в беду, если вы когда-либо будете использовать указатели для динамического выделения B
объекты в местах, где они будут освобождены, как если бы они были указателями на A
объекты.
Кроме того, потому что A::print1()
не было сделано virtual
вы попадаете во всевозможные проблемы сокрытия имен, поэтому вам нужно назвать расширенную функцию B::print2()
,
Короче говоря: знайте, какие уроки вы пишете. Если вы хотите расширить поведение на основе реализации класса, то лучше сделать его пригодным в качестве базового класса (виртуальный деструктор, виртуальные функции, которые вы можете переопределить). В противном случае отметьте ваш класс как final
(новое контекстное ключевое слово C++11). Это сгенерирует предупреждения компилятора, если вы попытаетесь переопределить существующие функции.
ПРИМЕЧАНИЕ. В других языках (особенно в D) можно разрешить компилятору автоматически находить функции, не являющиеся членами. print2(a)
когда он видит синтаксис a.print2()
, К сожалению, такой унифицированный синтаксис вызова функции пока отсутствует в C++.