2016-05-27 4 views
0

ここでは実用的な問題があります。データテーブルのクラスを拡張する必要があります。主なクラスは抽象的なインターフェイスです:サポートされていないクラスメソッドが使用されている場合、コンパイラエラーをスローする

class TableInterface { 
    abstract void something(some arguments) = 0; 
    abstract void something_2(some arguments) = 0; 
    // many more follow ... 
     ... 
    abstract int MyNewMethod() = 0; 
} 

これらのクラスは約6つの実装があります。私は1つの実装でそれを必要とし、これはしばらくの間変わらないでしょう。新しいメソッドはすべてのサブクラスで意味を持ち、実装することができます。私は今このオプションを残しています:

  • 実際に6つのすべてのクラスのメソッドを実装します。これは技術的な問題ではありませんが、決して使用されない多くの作業を意味します。メソッドはすべてのサブクラスに対してと意味があります。問題は設計されていませんが、私の怠惰です。
  • 空のメソッド本体をそのままにします。それは厄介です。

    abstract int MyNewMethod() {return -1;} 
    
  • スロー例外使用上またはassertを使用します。

    abstract int MyNewMethod() {throw std::std::runtime_error("Not implemented!");} 
         -- or -- 
        abstract int MyNewMethod() {assert("Not implemented yet!" && false);} 
    

問題は私のオプション1の間隔で、他のすべてのものをコンパイルする他のdeveloppersに問題を引き起こすことができるということですメソッド本体が実装されていないことを疑うコード。

クラスメソッドがの場合にエラーが発生する可能性があります。

+5

メンバー関数を宣言して実装しない場合はどうなりますか?この方法では、使用されていなければコンパイルされ、使用されている場合はリンカーエラーが生成されます。 – 101010

+0

リンカのエラーは非常に混乱しています。いつでもどこでもそれらを避けるでしょう。 –

+2

実際にあなたの場合、それほど混乱してはいけません。 TableInterface :: method'への未定義参照の行に沿って、参照を持つオブジェクトファイルの名前でリンカエラーが発生します – Smeeheey

答えて

1

あなたはの線に沿って何かを試みることができる:あなた自身のコードをコンパイルするときに-DMYNEWMETHOD_ALLOWED定義するスイッチが含まれるであろう、そして、

class TableInterface 
{ 
public: 
    ... 
    virtual int MyNewMethod() 
    { 
#ifndef MYNEWMETHOD_ALLOWED 
     static_assert(false, "MyNewMethod not implemented"); 
#endif 
     ... 
    } 
    ... 
}; 

を。この定義について知らないうちに、自分の仕事を編集している人は誰でも、コンパイルエラーが発生します。

関連する問題