2017-11-07 1 views
0

これは非常に単純な質問だと思うが、音が簡単にするには十分なC++が分からない。コンパイル時に使用する派生クラスを選択する

私は、抽象基本クラスContinuousDistributionを定義するコードと、CauchyまたはNormalのような派生クラスを定義しています。
私の目標は、変数Aのデフォルト定義を持つことですが、ユーザーがその定義を変更し、特に変数のタイプを変更できるようにします。 (私は実行時に再定義を意味するものではありません、それはコンパイル時の再定義をだ)

ので、デフォルトのファイルで、私は

default.cpp

... 
Normal A(0., 20.); // Normal is the default 
.... 
x = A.logpdf(); 

を持っているでしょうデフォルトのNormalディストリビューションを想定してコンパイルして実行します。

次に、Aの定義を変更できる「設定」ファイルを作成します。default.cppと一緒にコンパイルされます別のファイル、では、我々は持っている可能性があり

user1.cpp

... 
Normal A(0., 10.); // change the arguments of Normal 
.... 
call some functions defined in default.cpp, which use methods of A 
.... 

かと別の1

user2.cpp

... 
Cauchy A(0., 10.); // change the type of A 
.... 
call some functions defined in default.cpp, which use methods of A 
.... 

これを解決するにはdefault.cppextern Normal Aを使用しようとしましたが、変数をCauchyとして再定義することはできません。 また、をdefault.cppで試しましたが、これもうまくいきません。 Aの定義がdefault.cppから削除された場合、A.logpdf()を使用しているため、error: ‘A’ was not declared in this scopeでコンパイルできません。

どうすればこの問題を解決できますか?

コメントで示唆したように、私はまた、user2.cppdefault.cppNormal *A=new Normal(0,20);のようにポインタを使用してA = new Cauchy(0,10);でそれを再割り当てしようとしたが、その後user2.cppA was not declared in this scopeので、コンパイルされません。

+0

私はあなたが変数を再宣言している理由...やろうとしているかを理解 'tを... C++ではあなたが唯一の – Rama

+1

限り、彼らは異なるスコープ内にある、同じ名前の変数を宣言することができますに見えますグローバル変数を混乱させようとしているようです。コードなしでコードを書いてみてください。 – VTT

+0

あなたは、基本クラスへのポインタを使用して、それを再割り当てしようとしたことがありますか?このように:ノーマル* A =新しいノーマル(0.20); ... A =新しいノーマル(0,10); .... A =新しいコーシー(0,10);良いオプションのように思えるが、 – Victor

答えて

0

あなたは(あなたがそれを行う必要がありますので、良い習慣です)ヘッダを使用している場合は、次のように、あなたが行くことができます:

default.h

#ifndef _default_h_ 
    extern Normal *A; 
#define _default_h_ 
#endif 

default.cpp

#include "default.h" 

... 
Normal *A = new Normal(0., 20.); // Normal is the default 
.... 
x = A->logpdf(); 
... 

user1。CPP

#include "default.h" 

... 
delete A; // Free up memory 
A = new Normal(0., 10.); // change the arguments of Normal 
... 
call some functions defined in default.cpp, which use methods of A 
.... 

user2.cpp

#include "default.h" 

... 
delete A; // Free up memory 
A = new Cauchy(0., 10.); // change the arguments of Normal 
... 
call some functions defined in default.cpp, which use methods of A 
.... 

エクスターナル・キーワードは、コンパイラは連鎖段階のどこかに指定されたタイプと名前の変数が存在するであろう指示、ベースクラスのポインタを使用すること自体が誘導体を格納することができます。

関連する問題