コードをモジュール化したい。現時点では、子クラスから親クラスに関数を渡すようにコードを設定しています。しかし、それはまったくコンパイルされません。今私は合格機能をすべて一緒に取り除きたいが、「モジュール性」を保つ。クラス間で関数を渡すことなくC++のモジュール性を維持する
更新:私のコードが何をしているのかについての詳細を追加しました。私はまだ私がやっていることの大半を省いた。クラス分子はクラスレートの複数のインスタンスを最適化しています。クラスレートは、レート内の単一の関数によって生成される複数の値を最適化します。
Class Data_Analysis {
virtual double find_rms_A (vector<double>) = 0;
virtual double find_rms_B (vector<double>) = 0;
virtual double find_rms_C (vector<double>) = 0;
double E (double (Data_Analysis::*fxn(vector<double>)) {
// doing tons of stuff
(this->*fxn)(vec);
//Simplex is third party library that requires a function that
// takes vector<double> and outputs a double
//http://www.codeguru.com/cpp/article.php/c17505/Simplex-Optimization-Algorithm-and-Implemetation-in-C-Programming.htm
Simplex((this->*fxn)(vec));
}
};
Class Molecule: Data_Analysis {
virtual double find_rms_A (vector<double>) {
// using variables only declared in Molecule
double rms = 0.0
for (int data_point_A = 0; data_point_A < num_data_point_A; data_point_A++) {
Rates r(data_point_A);
r.run_simulation_v1();
rms += r.return_rate();
}
return rms;
}
virtual double find_rms_B (vector<double>) {
// using variables only declared in Molecule
double rms = 0.0
for (int data_point_B = 0; data_point_B < num_data_point_B; data_point_B++) {
//do stuff
rms += rate;
}
return rms;
}
void optimize_A() {
// set variables for type of optimization A
E(&Data_Analysis::find_rms_A);
}
void optimize_B() {
// // set variables for type of optimization B
E(&Data_Analysis::find_rms_B);
}
};
Class Rates: Data_Analysis {
virtual double find_rms_C (vector<double>) {
// using variables only declared in Rates
double rms = 0.0
for (int data_point_C = 0; data_point_C < num_data_point_C; data_point_C++) {
// run simulation that is completely different than anything used in Molecule
rms += rate;
}
return rms;
}
void optimize_C() {
// set variables for type of optimization C
E(&Data_Analysis::find_rms_C);
}
};
私は渡す機能を動作させるためにしようとしているもの:
Virtual Function 1、Virtual Function 2、Virtual Function 3:
Pointer Functions 1、Pointer Functions 2 "抽象型 'CHILD2' のように変数 'r' を宣言することはできません" : "初期化で" double(Child1 :: )(std :: vector) 'を' Parent :: fxn {別名double()(std :: vector)} 'に変換できません(アスタリスクはイタリック体になっています。 )
したがって、関数を渡すためにコードを再構成したいと思います。しかし、私は「関数E」を取り除き、関数A〜D(モジュール式を破棄する)でコードを繰り返さずにこれをどうやって行うのか分かりません。任意のヒント/アドバイス?
あなたが話していることを示す実際のコードを投稿してください。 –
実装しようとしている実際のユースケースについて詳しく教えてください。あなたの例はあまりにも工夫されているので。 – rustyx
これはXYの問題のようです。あなたはその奇妙さで実際に何を達成しようとしていますか? –