Как добавить метод в класс (вспомогательная функция)?

Как я могу добавить свой собственный метод в уже существующий класс без каких-либо изменений в контексте уже существующего класса.

например :

   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 ++.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]