我正在尝试使用对象的共享指针向量。我在获取任何成员变量时没有任何问题,但是当我尝试设置成员变量时,似乎没有任何工作。我必须在这里遗漏一些东西,因为这似乎应该有效。
#include <iostream>
#include <string>
#include <boost/random.hpp>
#include <iomanip>
using std::cin;
using std::cout;
using std::endl;
using std::string;
class vehicle{
public:
vehicle(){};
~vehicle(){};
virtual string getName(){
return this->name;
}
virtual string setName(string n){
this->name = n;
}
friend std::ostream& operator <<(std::ostream& outs, vehicle &v){
outs << v.getName();
return outs;
}
protected:
string name;
};
class car : public vehicle{
public:
car(){
this->name = "default name";
}
string setName(string n){
this->name = n;
}
string getName(){
return this->name;
}
};
typedef std::shared_ptr<vehicle> vehicle_ptr;
cout将打印字符串“默认名称”,然后当我尝试更改名称时 它会导致seg故障。
int main(){
std::vector<vehicle_ptr> vehicleLot;
vehicleLot.push_back(std::shared_ptr<car>(new car));
cout << vehicleLot[0]->getName() << endl;
vehicleLot[0]->setName("new name"); // this gives a seg fault
}
答案 0 :(得分:3)
您的setName
方法目前的返回类型为std::string
而不是void
。修复了vehicle
和car
类中的签名。
到达期望返回类型而没有return语句的函数的结尾是未定义的行为。为您选择的编译器启用适当的警告是个好主意,因为大多数编译器都很容易捕获它。
答案 1 :(得分:3)
代码中的错误是由setName
函数的错误定义引起的。看看它的回报:
virtual string setName(string n);
但是,你没有明确地返回任何内容,我认为这会导致未定义的行为。
在旁注中,您应该在此代码中更频繁地使用const&
。