これは非常に単純な質問だと思うが、音が簡単にするには十分な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.cpp
にextern Normal A
を使用しようとしましたが、変数をCauchy
として再定義することはできません。 また、をdefault.cpp
で試しましたが、これもうまくいきません。 A
の定義がdefault.cpp
から削除された場合、A.logpdf()
を使用しているため、error: ‘A’ was not declared in this scope
でコンパイルできません。
どうすればこの問題を解決できますか?
コメントで示唆したように、私はまた、user2.cpp
にdefault.cpp
で Normal *A=new Normal(0,20);
のようにポインタを使用してA = new Cauchy(0,10);
でそれを再割り当てしようとしたが、その後user2.cpp
はA was not declared in this scope
ので、コンパイルされません。
私はあなたが変数を再宣言している理由...やろうとしているかを理解 'tを... C++ではあなたが唯一の – Rama
限り、彼らは異なるスコープ内にある、同じ名前の変数を宣言することができますに見えますグローバル変数を混乱させようとしているようです。コードなしでコードを書いてみてください。 – VTT
あなたは、基本クラスへのポインタを使用して、それを再割り当てしようとしたことがありますか?このように:ノーマル* A =新しいノーマル(0.20); ... A =新しいノーマル(0,10); .... A =新しいコーシー(0,10);良いオプションのように思えるが、 – Victor