如何使用对象的共享指针向量

时间:2013-12-01 16:00:35

标签: c++ c++11

我正在尝试使用对象的共享指针向量。我在获取任何成员变量时没有任何问题,但是当我尝试设置成员变量时,似乎没有任何工作。我必须在这里遗漏一些东西,因为这似乎应该有效。

#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

}

2 个答案:

答案 0 :(得分:3)

您的setName方法目前的返回类型为std::string而不是void。修复了vehiclecar类中的签名。

到达期望返回类型而没有return语句的函数的结尾是未定义的行为。为您选择的编译器启用适当的警告是个好主意,因为大多数编译器都很容易捕获它。

答案 1 :(得分:3)

代码中的错误是由setName函数的错误定义引起的。看看它的回报:

virtual string setName(string n);

但是,你没有明确地返回任何内容,我认为这会导致未定义的行为。

在旁注中,您应该在此代码中更频繁地使用const&