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

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

например:

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

Другие вопросы по тегам