std :: string变量不保留其值

时间:2019-01-13 13:40:59

标签: c++ string oop

所以我有一个类的std :: list,并添加了其派生类的对象(例如“ Discus”是“ Item”的派生类)。我有几个std::string变量,并在构造函数中对其进行了初始化。 std::string变量是通过std::cin获得的,我将此类变量直接放入构造函数中。例如。 “名称”和“材料”,是通过std::cin获得的,只是std::string。因此它具有一些价值。但是当我退出该函数时,它的值是空的(就像“”)。什么会导致此问题?我想'name'和'material'变量将被删除,但是我不确定它是否正确以及如何解决此问题。 抱歉,这个问题有点傻,谢谢您的帮助。

class Discus : public Throwable, public Material {
public:
    Discus(int, int, int, std::string*, std::string*);
    void setMaterial(std::string*);
    void setType();
    std::string info();
};

class Storage {
private:
    std::list<Item*> storage;
public:
    std::list<Item*>* getStorage();
    void addItem(Item*);
    void showInfo();
};

这就是我用来添加项目的功能的实现:

void addItem(Storage* store) {
bool to_continue = true;
while (to_continue) {
    std::cout << "What to add?\n1)Discus\n2)Javelin\n3)Hammer\n4)Dumbbell\n5)Kettlebell\n6)Barbell\0 для to exit\n";
    int key = -1;
    std::cin >> key;
    if (key > 0 && key < 7) {
        int parameters[3];
        std::cout << "Enter price, amount of items, the weight of an item\n";
        for (int i = 0; i < 3; i++) std::cin >> parameters[i];
        std::string name;
        std::string material;
        int len = 0;
        std::cout << "Enter name:\n";
        std::cin >> name;
        switch (key) {
        case 1: {
            std::cout << "Enter a name of material:\n";
            std::cin >> material;
            Discus d(parameters[0], parameters[1], parameters[2], &material, &name);
            Discus* it = &d;
            (*store).addItem(it);
            break;  
        }
        case 2: {
            std::cout << "Enter a name of material:\n";
            std::cin >> material;
            std::cout << "Enter a length:\n";
            std::cin >> len;
            (*store).getStorage()->push_back(&Javelin(parameters[0], parameters[1], parameters[2], &material, len, &name));
            break; 
        }
        case 3: {
            std::cout << "Enter a name of material:\n";
            std::cin >> material;
            std::cout << "Enter a length:\n";
            std::cin >> len;
            (*store).getStorage()->push_back(&Hammer(parameters[0], parameters[1], parameters[2], &material, len, &name));
            break;
        }
        case 4:
        {(*store).getStorage()->push_back(&Dumbbell(parameters[0], parameters[1], parameters[2], &name)); break; }
        case 5: {
            std::cout << "Enter a name of material:\n";
            std::cin >> material;
            (*store).getStorage()->push_back(&Kettlebell(parameters[0], parameters[1], parameters[2], &material, &name));
            break;
        }
        case 6: {
            std::cout << "Enter a length:\n";
            std::cin >> len;
            (*store).getStorage()->push_back(&Barbell(parameters[0], parameters[1], parameters[2], len, &name));
            break;
        }
        }
    }
    else if (key == 0) 
        to_continue = false;
    else std::cout << "Sorry, try one more time\n";
}
}

1 个答案:

答案 0 :(得分:0)

其背后的主要原因是该对象超出范围可能会死亡。

看来您的情况有点像这样:

...
    if (key > 0 && key < 7) {
        ...
        std::string name;
        std::string material;
        ...
        switch (key) {
        case 1: {
            ...
            Discus d(parameters[0], parameters[1], parameters[2], &material, &name);
            Discus* it = &d;
            (*store).addItem(it);
            break;  
        } // d will die here. So, pointer it will become dangling
    } // name and material will die here. So, pointers to them will become dangling.

您可以考虑使用const std::string &代替std::string *。对于类Discus的对象,可以使用unique_ptr来代替{em> raw 指针。