2016-12-01 2 views
0

漠然としたタイトルのため申し訳ありません。私は複合的なデザインパターンで遊んでいて、次のような状況に遭遇しました。私はインターフェイスC++ Template Arrayクラス:エラーの生成は、インターフェイスを継承するかどうかによって異なります。

class interface 
{ 
public: 
    virtual ~interface() { } 
    virtual void methodA(const uint8_t* ptr) = 0; 
}; 

を持っていると私は(これは私はそれはあまり意味がありません知っているだけの簡単な例である)、このインターフェースに準拠したテンプレートクラスを持っていると言うと言います。

template <typename T> 
class customArray 
{ 
public: 
    void methodA(const uint8_t* ptr) 
    { 
     if (m_data.size()) 
     m_data[0].methodA(ptr); 
    } 

    int methodB(uint8_t* ptr) 
    { 
     if (m_data.size()) 
     return m_data[0].methodB(ptr); 

     return 0; 
    } 

    void push_back(const T& elm) 
    { 
     m_data.push_back(elm); 
    } 

private: 
    std::vector<T> m_data; 
}; 

テンプレートクラスはインターフェイスを継承しないことに注意してください。今、私はいくつかの単純なクラスを定義する場合

class customPrimitive 
{ 
public: 
    int methodB(uint8_t* ptr) 
    { 
     (void)ptr; 
     return -1337; 
    } 
}; 

そして、私はmethodAを呼び出そうと明らかにビルドが失敗する必要がありそう

customArray<customPrimitive> arr; 
arr.push_back(customPrimitive()); 
printf("Got %i\n", arr.methodB(NULL)); // Prints -1337 
// arr.methodA(NULL); This will make build fail 

のようにそれを使用しています。しかし、なぜ私はそれを呼び出すことを避けるときに失敗しないのですか?

さらに、配列にインターフェイスを継承させると、ビルドに失敗するのはなぜですか?この場合、メソッドを呼び出すかどうかに関係なく発生します。

誰もが私に感謝するいくつかの洞察力を提供することができれば。

おかげで、

答えて

1

あなたがそれを呼び出していないので、コンパイラはcustomArray.methodA離れを最適化しています。

+0

私はあなたが何を意味するかを見ます。他のクラスと他のクラスでテンプレートを使い、methodAを呼び出すため、混乱しました。しかし、customArray の特定のインスタンスの場合、メソッドは最適化されます。答えをありがとう。 – user2510141

0

あなたはインターフェイスクラスに純粋な仮想メソッド "methodA"があります。これにより、すべての継承者がこのメソッドを実装するよう強制されます。それはインターフェイス/抽象クラスの主なアイデアです。

関連する問題