我是std :: generate的新手,並試圖構造一個使用它初始化向量的程序。然而它的表現與我的期望不同。如何在一個多態函數對象中使用std :: generate/generate_n?
我有一個抽象基類:
template <typename G>
class RandomAllele {
public:
RandomAllele() { /* empty */ }
virtual ~RandomAllele() { /* empty */ }
virtual G operator()() const = 0;
};
這是由(例如)擴展:
class RandomInt : public RandomAllele<int> {
public:
RandomInt(int max) : max_(max) {}
int operator()() const { return rand() % max_; }
private:
int max_;
};
我通過指針傳遞我的繼承類的實例,以一個工廠類,和然後用它作爲std :: generate的第三個參數:
template<typename G, typename F>
class IndividualFactory {
public:
IndividualFactory(int length, const RandomAllele<G> *random_allele)
: length_(length), random_allele_(random_allele) { /* empty */ }
individual_type *generate_random() const {
std::vector<G> *chromosome = new std::vector<G>(length_);
std::generate(chromosome->begin(), chromosome->end(), *random_allele_); */
return new individual_type(chromosome);
}
private:
int length_;
RandomAllele<G> *random_allele_;
};
現在我得到一個錯誤, RandomAllele無法實例化,因爲它是一個抽象類。爲什麼當指針已經存在時,生成需要實例化呢?爲什麼它試圖使用基類而不是繼承類RandomInt?
如果我更換STD這工作得很好::生成:
for(auto iter = chromosome->begin(); iter != chromosome->end(); ++iter)
*iter = (*random_allele_)();
但我還是想了解爲什麼它的行爲很奇怪,我寧願使用產生是否有辦法做到這一點。
感謝您的時間,
里斯
那麼,爲什麼將它複製的基類,而不是我傳遞值嗎? – 2011-02-15 23:47:16
因爲您傳遞的值的類型是RandomAllele。 –
Erik
2011-02-15 23:52:14