コードをより柔軟にするために、C++ で戦略パターンを実装しようとしています (そして、OO プログラミングを学びます)。main() の 3 行目に表示される動的キャストが失敗します。また、かなり奇妙なエラーメッセージが表示されます。私が間違っていることを説明していただけますか?私は C++ でデザイン パターンを使用することに慣れていません。
コンパイラからのエラー メッセージ:
/*
/tmp/cc8b482g.o: In function `individual::setObjectiveFunction(int)':
main.cpp:(.text+0x20b): undefined reference to `ObjectiveFunctionhyperBowl::ObjectiveFunctionhyperBowl()'
/tmp/cc8b482g.o: In function `main':
main.cpp:(.text+0x25e): undefined reference to `ObjectiveFunctionhyperBowl::ObjectiveFunctionhyperBowl()'
main.cpp:(.text+0x344): undefined reference to `ObjectiveFunctionhyperBowl::~ObjectiveFunctionhyperBowl()'
main.cpp:(.text+0x3ac): undefined reference to `ObjectiveFunctionhyperBowl::~ObjectiveFunctionhyperBowl()'
*/
編集:宣言される前にクラスを使用していたという「6502」からの正しい提案がありました(これはコード全体のトリミングされたバージョンです)
ObjectiveFunctionhyperBowl のコンストラクタはありますね。
何が欠けていますか、宣言は使用されている場所のすぐ上にあり、まだ機能しません...
またよろしくお願いします!
そして、迅速な対応に感謝します!- これは Stack Overflow での最初の質問です。私がより優れたプログラマーになったときに、他のプログラマーを助ける行為に報いることを約束します!
#include <iostream>
#include <sstream>
#include <random>
#include <assert.h>
#include <vector>
class individual;
class objectiveFunctionStrategy;
/*
* This is my abstract class implementation for a strategy.
*/
class objectiveFunctionStrategy
{
public:
objectiveFunctionStrategy();
virtual ~objectiveFunctionStrategy();
virtual float evaluate(individual)=0;
};
/*
* The class individual should contain strategy objects
*/
class individual{
private:
std::vector<float> featureVector;
objectiveFunctionStrategy * ofstrategy;
unsigned int ndim;
public:
/*Constructors*/
individual(std::vector<float>);
float getObjectiveFunction();
void setObjectiveFunction(int k);
std::vector<float> getFeatureVector();
};
individual::individual(std::vector<float> fv){
for(unsigned int i=0;i<fv.size() ; i++){
featureVector.push_back(fv[i]);
}
this -> ndim = featureVector.size();
}
std::vector<float> individual::getFeatureVector(){
return this->featureVector;
}
float individual::getObjectiveFunction(){
/*
*Here I'm planning of passing a concrete strategy object to
*make the objective functions interchangeable.
*
*So the calculation would be ofstrategy.evaluate()
*/
float Fc=0;
if(false == false){
std::vector<float> vv = this->featureVector;
Fc = ofstrategy->evaluate(vv);
}
return Fc;
}
/*
* Now this one is a concrete strategy object class:
*/
class ObjectiveFunctionhyperBowl: public objectiveFunctionStrategy
{
public:
/*
* could have a reference to the individual.
* might do things a bit more complicated.
*/
ObjectiveFunctionhyperBowl();
~ObjectiveFunctionhyperBowl();
float evaluate(individual ind){
float Fc =0 ;
std::vector<float> v = ind.getFeatureVector();
for(unsigned int i=0;i<v.size();i++){
Fc += v[i]*v[i];
}
return Fc;
}
};
void individual::setObjectiveFunction(int i){
/*
* here the strategy is defined inside the class by an integer
*/
this->ofstrategy = new ObjectiveFunctionhyperBowl;
}
int main(){
std::vector<float> v;
ObjectiveFunctionhyperBowl hb;
objectiveFunctionStrategy* ofs;
ofs = dynamic_cast<objectiveFunctionStrategy*> (&hb);
individual indiv(v);
/*
* Now the above still does not compile...
* error message:
*
*
*
*/
v.push_back(2.1);
v.push_back(22.1);
hb.evaluate(indiv);
}