2016-09-29 117 views
0

为什么会产生分段错误,当我创建一个矩形对象?我在想,我的构造函数有一些不正确的地方,但我没有足够的C++经验来确定它是什么。分段故障

#include <string> 
#include <map> 

using namespace std; 

class Shape { 
private: 
    string name; 
    string property_name; 
    map<string,double> parameters; 


public: 
    Shape(){ 
    } 

    void set_name(string n){ 
     name=n; 
    } 

    string set_property_name(string s){ 
     property_name=s; 
    } 

    void set_parameter(string p, double n){ 
     parameters[p]=n; 
    } 

    double get_parameter(string p) { 
     return parameters[p]; 
    } 

    virtual double get_property() = 0; 

}; 

class Shape2D: public Shape { 
public: 
    Shape2D() { 
     set_property_name("area"); 
    } 
}; 

class Rectangle: public Shape2D { 
public: 
    Rectangle() { 
     set_name("rectangle"); 
     set_parameter("length",0); 
     set_parameter("base",0); 
    } 

    double get_property() { 
     return get_parameter("length") * get_parameter("base"); 
    } 
}; 


int main() { 
    Shape * user_shape; 
    user_shape=new Rectangle(); 
    return 0; 
} 
+2

正常工作在这里。无法重现。代码看起来非常好。使用调试器来找出错误。 –

+0

'set_property_name(string s)'应该是'void'类型而不是'string'.不能重现问题。 –

+1

@让FrançoisFabre你需要一个更好的编译器或更高版本警告:http://coliru.stacked-crooked.com/a/7bee0da403209195 – NathanOliver

回答

4

因为你string set_property_name(string s)没有return,是不确定的行为

+1

我不能编译'set_propert_name(string s)''void'.How不会返回创建segFault。 –

+0

@GauravSehgal也许你会添加一些标志,你的编译器会把*看作是错误? –

+1

@GauravSehgal有些编译器会让编译器没有返回语句,因为它们只发出警告而不是错误。在这种情况下,当代码达到它尝试访问返回值的地步,但没有提供返回值时,就会出现段错误。 – NathanOliver