带有指针/非指针的C++分段错误
C++ Segmentation Fault with Pointer/Non Pointer
它告诉我这里有一个分段错误:
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;
}
如果没有cout << a.doTheJob() << endl;
,它就可以工作。如果我用cout<lt;"好";没关系。因此,这种方法产生了分割错误。
Atelier::Atelier(MonteurVoiture *mont) { _monteur=mont; }
Voiture* Atelier::doTheJob()
{
_monteur->createVoiture();
_monteur->addPortiere();
_monteur->addSiege();
return _monteur->getVoiture();
}
Voiture
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);
};
和MonteurVoiture
class MonteurVoiture
{
protected:
Voiture *v;
public:
~MonteurVoiture();
Voiture* createVoiture();
Voiture* getVoiture();
virtual void addPortiere() =0;
virtual void addSiege() =0;
static MonteurVoiture* instanceVoiture(std::string type);
};
Voiture* MonteurVoiture::createVoiture() { return new Voiture(); }
Voiture* MonteurVoiture::getVoiture() { return v; }
提前感谢
快速修复
好的,首先解决你的问题:
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* Atelier::doTheJob()
{
_monteur->createVoiture();
_monteur->addPortiere();
_monteur->addSiege();
return _monteur->getVoiture(); /* this is undefined without the fix in createVoiture() above */
}
总体设计问题
你的物品设计很奇怪。你有一辆汽车(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);
}
}
注意:以上大部分都是伪代码,它应该向您展示替代概念,从中获取想法,而不是逐字逐句地复制
我用了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; }
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错