2012-04-19 10 views
4

は私が例、printfのように振る舞っコンストラクタで使用するにconvinient例外クラスを記述しようとしています:コンストラクタを継承する方法、または未知数のパラメータでコンストラクタを呼び出す方法は?

class ExcBase 
{ 
    ExcBase(const char *fmt, ...) 
    { 
     // call things like vsprintf 
    } 
}; 

が、構造体の継承は、C++で利用できていないようですので、私のような継承されたクラスを記述します:

class ExcChild : public ExcBase 
{ 
    ExcChild(const char *fmt, ...) 
     : ExcBase(fmt, ...) // XXX: how to pass the trailing parameters to the constructor? 
    { 
    } 
}; 

または私はすべての子クラスに同じコンストラクタを記述する必要があります、それはあまりにも迷惑だった...

この質問は私をたくさんトラブル、と私は解決する方法を把握することはできませんこれ... 任意の情報は大きな助けになります...

+0

「書き込み機能」とはどういう意味ですか? – Tim

答えて

0

あなたがたva_list引数を取る関数に煩雑な作業を分離した場合、あなたは(あなたはまだ、それぞれの子のタイプに実装する必要があると思います)、それぞれの子のコンストラクタからそれを呼び出すことができるはずです。次に、重複したコード(クラスごと)がva_listを宣言してから、va_start、新しい(基本)関数、およびva_endを呼び出します。そのことについてはa post here on SOがあります。

+0

私は今、例外クラスがそれほど大きくないので、望ましいコンストラクタを宣言するマクロを定義することで、この問題を解決しています。すべての派生クラスが明示的にこのマクロを呼び出します。 – Tim

1

あなたがコードをそれをサポートしていない古いコンパイラでコンパイルする必要がないなら、コンストラクタを継承することができます(そして今後のVC++ 11しかし、この方法では "古い"と考えられます)

実際には、実際の構築作業をvprintfのような関数に入れて、コンストラクタに呼び出させることができます。

+0

これによれば、http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupportコンパイラはまだ継承していません。バマー。 – emsr

+0

C++ 11標準はこれを提案しましたが、今までgccによって実装されていません。 – Tim

0

あなたはC++ 11タプルでテンプレートすることができますが、それは私が考えることができる唯一のものです。

+0

ありがとう!それは素晴らしい考えですが、私は例外クラスを作成しているので、継承関係がより重要です。 – Tim

1

コンストラクタですべての作業を実行しないでください。分割してください - 好きな方法で文字列を作成し、その文字列をコンストラクタに渡す関数を提供してください。

std::string format_string(const char * fmt, ...); 

class ExcBase 
{ 
    ExcBase(const std::string & message); 
}; 
+0

+1、しかし、注意して、私はそのようなことをする方法を尋ねて私の頭を噛んで得た:[ここをクリック](http://stackoverflow.com/questions/2880248/stdstring-resize-and-stdstring-length) – dreamlax

関連する問題