所以我有一个类的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";
}
}
答案 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 指针。