我创建了自己的智能指针类,我使用这个智能指针指向一个类实例,如何正确返回智能指针

时间:2017-04-03 04:05:14

标签: c++ smart-pointers

我是C ++的新手,并试图实现一些方法。

我创建了一个智能指针类CarPtr,如下所示:

template <class Car>
class CarPtr
{
public:
    Car *ptr;  // Actual pointer
   // Constructor
   explicit CarPtr(Car *p = nullptr) { ptr = p; }
   // Destructor
   ~CarPtr() { delete(ptr); cout << "CarPtr destructor" << endl;}
   // Overloading dereferencing operator
   Car &operator *() {  return *ptr; }
   Car *operator -> () { return ptr; }
};

#endif /* CARPTR_H_ */

然后我创建了一个Car类的实例,并使用我的智能指针指向它。

CarPtr<Car> carInfoCreation()
{
    CarPtr<Car> p(new Car());
    int carId;
    int carYear;
    double carCost;
    String carMake;
    String carModel;
    cout << "please enter the Id for the car" << endl;
    cin >> carId;
    p.ptr->setId(carId);

    cout << "please enter the Year for the car" << endl;
    cin >> carYear;
    p.ptr->setYear(carYear);

    cout << "please enter the Cost for the car" << endl;
    cin >> carCost;
    p.ptr->setCost(carCost);

    cout << "please enter the Make for the car" << endl;
    cin >> carMake;
    p.ptr->setMake(carMake);
    String getMake = p.ptr->getMake();

    cout << "please enter the Model for the car" << endl;
    cin >> carModel;
    p.ptr->setModel(carModel);
    String getModel = p.ptr->getModel();

    cout << "Car Info: " << endl;
    cout << "Car Id: "<< p.ptr->getId() << endl;
    cout << "Car Year: "<< p.ptr->getYear() << endl;
    cout << "Car Cost: " << p.ptr->getCost() << endl;
    cout << "Car Make: " << getMake << endl;
    cout << "Car Model: " << getModel << endl;

    ofstream myfile;
    myfile.open ("Car 1.txt");
    myfile << "Car Id: " << carId << endl;
    myfile << "Car Year: " << carYear << endl;
    myfile << "Car Cost: " << carCost << endl;
    myfile << "Car Make: " << carMake << endl;
    myfile << "Car Model: " << carModel << endl;
    myfile.close();

    return p;
}

创建实例后,我希望返回智能指针p并将其放入我创建的智能指针数组中,如下所示:

CarPtr<Car> CarPtrArray[5];
CarPtrArray[0] = carInfoCreation() ;

运行代码后,实例成功创建,我可以看到相应的.txt文件。但就在那之后,我将看到Eclipse显示的错误:

&#34; xxx.exe已停止工作

问题导致程序无法正常工作。如果解决方案可用,Windows将关闭程序并通知您。&#34;

有人可以帮我解决这个问题吗?如果您需要更多代码或相关信息,请告诉我。

非常感谢!

1 个答案:

答案 0 :(得分:0)

您的课程需要遵循the Rule of Three/Five/Zero

如果没有这个,那么按值返回一个导致未定义的行为:当销毁临时返回对象(和/或返回本地对象)时,指针将被删除,但是调用代码继续使用指针。