C++ C++;指针/非指针的分段错误
它告诉我这里有一个分段错误:C++ C++;指针/非指针的分段错误,c++,pointers,segmentation-fault,allocation,C++,Pointers,Segmentation Fault,Allocation,它告诉我这里有一个分段错误: class Atelier /* Director qui va executer les méthodes du monteur */ { private: MonteurVoiture *_monteur; public: Voiture* doTheJob(); Atelier(MonteurVoiture *mont); }; int main() { MonteurVoiture *monteur=MonteurVoiture::instanc
class Atelier /* Director qui va executer les méthodes du monteur */
{
private:
MonteurVoiture *_monteur;
public:
Voiture* doTheJob();
Atelier(MonteurVoiture *mont);
};
int main()
{
MonteurVoiture *monteur=MonteurVoiture::instanceVoiture("luxe");
Atelier a(monteur);
cout << a.doTheJob() << endl;
return 0;
}
班级福利
class Voiture
{
private:
std::string portiere;
std::string siege;
public:
void setPortiere(std::string p);
void setSiege(std::string s);
friend std::ostream &operator<<(std::ostream &o,const Voiture *v);
};
提前感谢我用了Valgrind,上面写着:
==19269== at 0x38B0D: std::string::assign(std::string const&) (in /usr/lib/libstdc++.6.0.9.dylib)
==19269== by 0x100001E02: Voiture::setPortiere(std::string) (in ./main.exe)
==19269== by 0x1000018AA: MonteurVoitureLuxe::addPortiere() (in ./main.exe)
==19269== by 0x10000120C: Atelier::doTheJob() (in ./main.exe)
==19269== by 0x100002029: main (in ./main.exe)
来自MonteurVoitureLuxe的addPortiere方法
void MonteurVoitureLuxe::addPortiere() { v->setPortiere("diamand"); }
还有来自Voiture的setPortiere
void Voiture::setPortiere(std::string p) { this->portiere=p; }
快速修复
好的,首先解决您的问题:
class MonteurVoiture
{
protected:
Voiture *v; // how is this being set???
public:
~MonteurVoiture();
Voiture* createVoiture();
Voiture* getVoiture();
virtual void addPortiere() =0;
virtual void addSiege() =0;
static MonteurVoiture* instanceVoiture(std::string type);
};
Voiture* MonteurVoiture::createVoiture() { return MonteurVoiture::v = new Voiture(); }
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ you need this
Voiture* MonteurVoiture::getVoiture() { return v; }
出现此问题是因为您根本没有设置Voiture*v值,而是在doTheJob()中使用它:
总体设计问题
你的物体设计很奇怪。你有一辆车(Voiture类),然后在MonteurVoiture中对它进行修改。是什么控制了这辆车
你可以考虑如下结构:
class Option {
public:
virtual std::string name() = 0; /* name of the option */
void add(Voiture &v) {
v.addOption(this);
}
virtual std::string getDetails() = 0; /* details of the option */
};
class optionDeSeiges: public Option {
public:
virtual inline std::string name() { return "Sieges"; }
};
virtual std::string getDetails() {
}
class Voiture {
std::List<Option *> options; /* an array of options */
void addOption(Option *o) {
options.add(o);
}
}
类选项{
公众:
虚拟std::string name()=0;/*选项的名称*/
无效添加(Voiture&v){
v、 添加选项(本);
}
虚拟std::string getDetails()=0;/*选项的详细信息*/
};
类别选项seiges:公共选项{
公众:
虚拟内联std::string name(){返回“围攻”;}
};
虚拟标准::字符串getDetails(){
}
阶级自由{
std::List options;/*选项数组*/
void addOption(选项*o){
增加(o);
}
}
注意:以上大部分是伪代码,它应该向您展示其他概念,从中汲取想法,不要逐字复制。问题是Voiture类是什么样子的?特别是
Voiture::getVoiture()
好了,现在friend std::ostream&operator的实现是什么呢。让我先给你一个答案,谢谢你,它很有效。那么,它并不完全有效。我将{return Voiture::v=new Voiture();}替换为{return MonteurVoiture::v=new Voiture()。第三:这不是一个真正的对象设计,我只是一个初出茅庐的开发人员,正在编程大约几个月,我决定看看设计模式(这里是构建者)。否则,非常感谢:-)呜呜,我本想写MonteurVoiture::v:P
class MonteurVoiture
{
protected:
Voiture *v; // how is this being set???
public:
~MonteurVoiture();
Voiture* createVoiture();
Voiture* getVoiture();
virtual void addPortiere() =0;
virtual void addSiege() =0;
static MonteurVoiture* instanceVoiture(std::string type);
};
Voiture* MonteurVoiture::createVoiture() { return MonteurVoiture::v = new Voiture(); }
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ you need this
Voiture* MonteurVoiture::getVoiture() { return v; }
Voiture* Atelier::doTheJob()
{
_monteur->createVoiture();
_monteur->addPortiere();
_monteur->addSiege();
return _monteur->getVoiture(); /* this is undefined without the fix in createVoiture() above */
}
class Option {
public:
virtual std::string name() = 0; /* name of the option */
void add(Voiture &v) {
v.addOption(this);
}
virtual std::string getDetails() = 0; /* details of the option */
};
class optionDeSeiges: public Option {
public:
virtual inline std::string name() { return "Sieges"; }
};
virtual std::string getDetails() {
}
class Voiture {
std::List<Option *> options; /* an array of options */
void addOption(Option *o) {
options.add(o);
}
}