class MyLinkedList
{
int size_;
Node head;
void setVal(void *val, int type)
{
Node n;
n.value = val;
head.next->prev = &n;
n.next = head.next;
head.next = &n;
n.prev = &head;
n.type = type;
size_++;
}
MyLinkedList()
{
size_=0;
head.type = 0;
head.next = &head;
head.prev = &head;
}
void setValue(string value)
{
cout << value << endl;
setVal(&value,3);
}
void toConsFirst()
{
int *i;
double *d;
string *s;
switch(head.next->type)
{
case 3:
s = (string*)(head.next -> value);
cout << *s << endl;
return;
}
}
}
我遇到案例3的问题:来自“* s”不会在控制台上打印字符串。但是在setValue()字符串中,“value”是可以的。我在“&amp; value”中从“value”和在案例3中“s”上的“* s”中更改seValue()。这与addr相同。
答案 0 :(得分:4)
问题是你要存储一个指向临时的指针:
void setValue(string value){
cout << value << endl;
setVal(&value,3);
}
此处,setVal()
会在列表中保留&value
,但value
的生命周期不会超出上述方法。解决这个问题的一种方法是在堆上分配字符串的副本(但是在完成后不要忘记解除分配)。
正如@Mat在评论中指出的那样,setVal()
中存在类似的错误,它会尝试保留指向本地Node n
的指针。
最后,我找到了保持类型id的整个方案,然后开启它们看起来很痛苦。我意识到这可能是一个编程练习,你可能还没有被介绍过模板,但如果你有,那么这对他们来说是一个完美的应用。
答案 1 :(得分:0)
以下是通过在堆上分配新字符串并将传入的字符串值复制到其中来修复setValue的方法:
void setValue(string value){
string* s = new string(value);
setVal(s, 3);
}