這是發生錯誤的方法。 這裏的目標是產生一定數量的基於模型晶粒(模型)的砂粒,對於給定的小時間增量dt。 穀物是一個抽象類,因爲它純粹是虛擬的方法,它必須是這樣的。 問題上xcode C++錯誤:分配抽象類類型'Grain'的對象
for(size_t a(0); a<vect.size(); ++a){
vect[a] = new Grain(*modele);
}
似乎沒有這個初始化循環,矢量返回所有相同的穀物,但我需要他們會略有不同(在Aleatoire類提供了必要的工具)。 例如,如果我這樣做
for(size_t a(0); a<vect.size(); ++a){
vect[a] = modele;
}
錯誤消失,但矢量返回包含所有相同的穀物,他們都是最後一粒從設定循環
std::vector<Grain*> Source::creation(std::vector<Grain*> grains, double dt){
vector<Grain*> vect; //vide par defaut
Aleatoire generateur(1);
//determiner nombre de grains a generer: DEBUT ALGO
double fraction = debit*dt; // fraction = debit "vrai", mais a priori non entier
int nombre(fraction); // partie entière
fraction -= nombre; // partie fractionnaire
// on ajoute 1 au hasard, proportionnellement à la partie fractionnaire :
if (generateur.uniforme(0.0, 1.0) < fraction) ++nombre;
//---FIN ALGO---
cout<<"Pour un pas de temps "<<dt<<" on genere "<<nombre<<" grains."<<endl;
double x, y, z, r;
vect.resize(nombre, nullptr);
for(size_t a(0); a<vect.size(); ++a){
vect[a] = new Grain(*modele);
}
cout<< "APRES LA FONCTION RESIZE, la taille du tableau est : "<<vect.size()<<endl;
for(size_t i(0); i<nombre; ++i){
(vect[i])->setPosition(position); //Le grain genere est genere a la position de la source
x = generateur.gaussienne(vitesse_iMoyenne.getCoord_x(), ecart_typeVitesse);
// cout<<"x = "<<setw(2)<<x<<" ";
y = generateur.gaussienne(vitesse_iMoyenne.getCoord_y(), ecart_typeVitesse);
// cout<<"y = "<<setw(2)<<y<<" ";
z = generateur.gaussienne(vitesse_iMoyenne.getCoord_z(), ecart_typeVitesse);
// cout<<"z = "<<setw(2)<<z<<" ";
Vecteur3D v(x,y,z);
// cout<<"Le nouveau vecteur vitesse est : "<<setw(2)<<v<<" "<<endl;
vect[i]->setVitesse(Vecteur3D(x,y,z));
// cout<<"Le vecteur vitesse copie est : "<<setw(2)<<vect[i]->getVitesse()<<" "<<endl;
r = generateur.gaussienne(modele->getRayon(), ecart_typeRayon);
// cout<<"Le nouveau rayon est : "<<setw(2)<<r<<" "<<endl;
vect[i]->setRayon(abs(r));
// cout<<"Le rayon copie est : "<<vect[i]->getRayon()<<" "<<endl;
// cout<<"Affichage dans la methode, dans la boucle for : "<<endl;
// cout<<setw(2)<<i<<" "<<*(vect[i])<<endl;
// cout<<endl;
}
// cout<<"Affichage dans la methode du vecteur de grains generes : "<<endl;
// for(size_t j(0); j<vect.size(); ++j){
// cout<<setw(2)<<j<<" "<<*(vect[j])<<endl;
// }
// cout<<endl;
return vect;
}
這裏是Grain.hpp:
#ifndef Grain_hpp
#define Grain_hpp
#include "Vecteur3D.hpp"
#include "Dessinable.hpp"
class Grain : public Dessinable {
public:
Grain(Vecteur3D p={0.0,0.0,0.0}, Vecteur3D v={0.0,0.0,0.0}, double m = 1.0, double r = 1.0, Vecteur3D f = {0.0,0.0,0.0}, SupportADessin* support = nullptr);
virtual ~Grain();
double masse() const;
//eta_milieu est la constante de viscosite du milieu
double lambda() const; //coef de frottement fluide
void ajouteForce();
void bouger(double pas);
virtual void affiche(std::ostream& sortie) const ;
void setVitesse(Vecteur3D const& v);
void setPosition(Vecteur3D const& p);
void setRayon(double const& r);
Vecteur3D getPosition() const;
double getRayon() const;
Vecteur3D getVitesse() const;
Vecteur3D calcule_force() const;
virtual Vecteur3D* vecteurForce(Grain* grain) const =0;
//Methodes forces virtuelles
virtual void ajouteForce(Obstacle* obstacle) = 0;
virtual void ajouteForce(Grain* grain) = 0;
virtual void ajouteForce(Vecteur3D) = 0;
//Dessinable
Grain(SupportADessin* vue)
: Dessinable(vue)
{}
virtual void dessine() override;
protected:
Vecteur3D position;
Vecteur3D vitesse;
double m_volumique;
double rayon;
Vecteur3D force;
};
std::ostream& operator<<(std::ostream& sortie, Grain const& g) ;
#endif /* Grain_hpp */
爲什麼'穀物'有純虛函數呢? – NathanOliver
如果不是不言而喻的話,那麼這個錯誤就不算什麼。 '糧食'是一個抽象類。你的純粹虛擬成員鞏固了這一地位。所以...停止嘗試製作具體的實例。 – WhozCraig
感謝@WhozCraig的評論。 那麼我知道我不能創建一個抽象類的具體實例,但在這裏我只是指向一個指針。 沒有任何東西禁止做可能不同但屬於同一個超類的異構對象集合。 就像後來成爲飛機汽車潛艇等的一系列車輛一樣。 –