2016-05-26 16 views
0

私は、C++クラスのいくつかの高度な点、可能な限り(または少なくともGNUとの)コンパイラ/ビルトイン関数を題材にしています。これらのすべては、(大規模かつ広範な)作業プロジェクトのロガーコンセプトに基づいています。これは、この擬似コードに私をもたらします:基本クラス関数の自動呼び出し

class Base { 
    public: 
      void increment(){ 
       ++m_Val; 
      } 
    private: 
      static int m_Val; 
}; 
class Above : private Base{ 
    public: 
      void doA(){ 
       //Foo 
      } 
      void doB(){ 
       //Bar 
      } 
}; 

概念として示されたこと。ベースの単なる継承で、doA()doB()は暗黙のうちに基本関数increment()を暗黙的に呼び出すことができます。私は実際にそれを継承するすべての単一クラスの関数ごとにincrement()に関数呼び出しを追加しますか?直接的な答えではない場合、私は何をしたいのために特別な言葉が呼ばれていますか? Boostや他の図書館の一部として提供されていますか?

+0

私はそれが存在するとは思わない。 –

+1

[アスペクト指向プログラミング](https://en.wikipedia.org/wiki/Aspect-oriented_programming)に興味があるかもしれません。 – AlexD

+0

@ DanielA.White私が恐れていたことは間違いありません。私はC++がまだ「成長している」言語であることは知っていますが、「ハッキーコード」を使用してそれを行う方法があるかどうかは分かりませんでした。 – M4rc

答えて

0

。私が探しているものに最もよく似たソリューションは、Hereのように "Execute-Around pointer"と呼ばれています。特に関連するセクション:

多くの場合、クラスのメンバー関数呼び出しの前後に機能を実行する必要があります。

これは、上記のリンクから取得した次のコードスニペットで表されます。

class VisualizableVector { 
    public: 
    class proxy { 
     public: 
     proxy (vector<int> *v) : vect (v) { 
      std::cout << "Before size is: " << vect->size(); 
     } 
     vector<int> * operator ->() { 
      return vect; 
     } 
     ~proxy() { 
      std::cout << "After size is: " << vect->size(); 
     } 
     private: 
     vector <int> * vect; 
    }; 
    VisualizableVector (vector<int> *v) : vect(v) {}  
    proxy operator ->() { 
     return proxy (vect); 
    } 
    private: 
    vector <int> * vect; 
}; 
int main() 
{ 
    VisualizableVector vecc (new vector<int>); 
    //... 
    vecc->push_back (10); // Note use of -> operator instead of . operator 
    vecc->push_back (20); 
} 
0

同様の効果を達成する1つの方法は、前提条件および事後条件を呼び出す異なるパブリックメソッドをオーバーライドして公開する方法を提供します。

class Base { 
    public: 
      void increment(){ 
       ++m_Val; 
       std::cout << m_Val << '\n'; 
      } 
      void doA(){ 
       increment(); 
       implA(); 
      } 
      void doB(){ 
       increment(); 
       implB(); 
      } 
    protected: 
     virtual void implA() = 0; 
     virtual void implB() = 0; 

    private: 
      int m_Val; 
}; 
class Above : private Base{ 
    public: 
    using Base::doA; 
    using Base::doB; 
    protected: 
     virtual void implA() override { 
      std::cout << "a\n"; 
     } 
     virtual void implB() override { 
      std::cout << "b\n"; 
     } 
}; 

int main() 
{ 
    Above a; 
    a.doA(); 
    a.doB(); 
} 

Demo

+0

「Base」を継承するすべてのクラスからすべての関数を複製(または最小限コピー&ペースト)する必要があるのは、私が持っていた反対の(しかしまだ期待されている)希望。 – M4rc

+0

残念ながら、C++は、コピー&ペーストなしでは、あなたが望む効果を達成するのに十分なほど動的ではありません。別の解決策は、重複したコードの量を減らすマクロを使用することです。それ以外の場合は、コードジェネレータを使用して重複したコードを生成できます。 –

+0

それは私が考えていたことです、悲しいことに - インターフェイス全体のマクロ。たぶん誰かが仕事をしているかもしれません。 – M4rc

0

あなたは、あなたの基本メソッドを呼び出すことにしたい時に明示的に定義する必要がありますが、それはインクリメントするための呼び出しを抽象化することによって行うことができます - (擬似、このパターンのようなものを試してみてください私はのようにすぐに同等のC++の構文に慣れていないんだけど、あなたがそれの要点を取得する必要がありますとしてのJavaの用語を使用してコード):純粋な事故で、これににつまずく後

abstract class Base { 
    public: 
      void increment(){ 
       ++m_Val; 
      } 
      void doA(){ 
       increment(); 
       doAInternal(); 
      } 
      void doB(){ 
       increment(); 
       doBInternal(); 
      } 
    protected: 
      abstract void doBInternal(); 
      abstract void doAInternal(); 
    private: 
      static int m_Val; 
}; 
class Above : private Base{ 
    public: 
      void doAInternal(){ 
       //Foo 
      } 
      void doBInternal(){ 
       //Bar 
      } 
}; 
関連する問題