该程序是用C ++编写的。我试图使用void函数来扩展一个Line结构,该结构由一个整数长度和一个指向下一个连接线的指针组成。有一个void Expand函数,用于为结构中的行指针赋予行引用。新线的尺寸是当前线的两倍。使用我正在使用的代码,我得到了一个g ++错误“接受临时[-fpermissive]的地址”。任何人都可以建议一种方法,函数将行引用的有效实例添加到行指针nextLine?
struct Line
{
int length;
Line* nextLine;
};
Line NewLine(Line& lineRef)
{
Line newLine;
newLine.length = lineRef.length * 2;
return newLine;
}
void Expand(Line& lineRef)
{
//Error here states: Taking address of temporary [-fpermissive]
lineRef.nextLine = &NewLine(lineRef);
}
int main() {
Line line;
Expand(line);
cout << line.length << endl;
cout << line.nextLine->length << endl;
return 0;
}
答案 0 :(得分:3)
该行的问题:
lineRef.nextLine = &NewLine(lineRef);
是编译器告诉你的。你正在拿一个临时的地址。这意味着在达到;
之后,临时NewLine(lineRef)
将被销毁,指针lineRef.nextLine
将成为指向死对象的指针。
更新:如何使其发挥作用。
这取决于你想做什么。如果您想要的是列表,那么最简单的事情就是使用预先打包的list
数据结构(std::list<Line>
),而不是滚动您自己的列表实现。
如果你真的想要实现自己的列表,那么你需要动态分配下一个节点(这将使编译器满意),你需要添加代码到 manage 列表(正确构造初始化字段的Line
对象,包括 copy-construction ,析构函数来管理动态内存,可能是一些辅助函数来 walk 列表(或迭代器以便能够使用算法...)只是不要打扰并使用std::list
。
答案 1 :(得分:3)
您正在尝试实施链接列表,但您还不了解手动内存管理。
短期解决方案是使用std::list<Line>
。已经有一个有效的解决方案,你不需要为幕后的东西烦恼。
长期解决方案也是使用std::list<Line>
。即使您是经验丰富的开发人员并且知道如何操作,也无需重新发明轮子。
答案 2 :(得分:1)
这个有效
struct Line
{
int length;
Line* nextLine;
~Line(){delete nextLine;}
//Make copy constructor and assignment operator private
};
void Expand(Line* lineRef)
{
lineRef->nextLine = new Line;
lineRef->nextLine->length = 2*(lineRef->length) ;
}
int main()
{
Line* line = new Line;
line->length = 5;
Expand(line);
cout << line->length << endl;
cout << line->nextLine->length << endl;
delete line;
return 0;
}