我的函数get_num
返回long int
的变量。
我想写下一个运算符:
long int& operator [] (long int i) {
long int a = get_num(i);
int& b = a;
return b;
}
但我收到了下一个错误:
error C2440: 'initializing' : cannot convert from 'long' to 'int &'
error C2440: 'return' : cannot convert from 'int' to 'long &'
如何修改它而不更改get_num
的功能?
任何帮助表示赞赏!
我有一个班级:
class B {
B* next;
long int nom;
long int denom;
public:
long int get_nom() {return nom; }
long int get_denom() {return denom; }
};
class List {
B* head;
public:
long int& operator [] (long int desired_denom) {
// here I search the node that containts the denom that is equal to desired_denom
// and insert it to tmp (it's a pointer to B).
long int a1 = tmp->get_nom()
long int& a2 = a1;
return a2;
}
};
现在在main
,我想这样做:
int main() {
A a; // assume that it creates the list of B and put values in each node (each B)
// here I want to do:
a[2] = 3; // it should search the node that his denom is equal to 2, and puts 3 instead of his nom
return 0;
}
例如:
如果我的清单是:
(nom=5, denom=6)->(nom=1,denom=8)->(nom=4, denom=2)->NULL
第a[2]=3
行在节点上搜索他的denom为2(它是第三个节点)并将其nom设置为3.
所以在这一行之后,我的列表将是:
(nom=5, denom=6)->(nom=1,denom=8)->(nom=3, denom=2)->NULL
答案 0 :(得分:1)
编译错误适用于此行
int& b = a;
^^^^
应该是
long int& b = a;
^^^^^^^^
并且,正如朋友在评论中所说的那样,返回对局部变量的引用会导致未定义的行为,因为退出函数后该引用的变量将被销毁。
盲目地回答,如果get_num
正确地返回引用,您可能需要返回对get_num
的引用。
return get_num(i);
答案 1 :(得分:1)
目前在您的代码中,没有办法以您希望的方式修改节点。必须先更改get_nom
以返回引用,然后才能按照您希望的方式运行。现在,您只能复制链表的每个节点中的值。
假设tmp设置正确,您可以返回get_nom
long int& operator [] (long int i) {
//Get tmp here probably by list traversal
return tmp->get_nom(i);
}
然后执行get_nom
。值得注意的是,nom
必须是一个具有足够长寿命的值,如下所述。返回该类私有的nom
,当函数返回时,它不会超出范围。
long int& get_nom() {return nom; }
get_nom
必须返回long int&
才能生效。返回long int
和long int&
之间存在重要差异。当返回类型为long int
时,将返回您要返回的值的副本并将其传递给调用者。当您返回long int&
或换句话说,通过引用返回long int时,引用指向存储值的内存中的位置。此引用允许您更改long int的值,同时它仍存储在数组的中间或您正在使用的任何数据类型中。
另一个重要的副作用是,如果返回对局部变量的引用,当变量超出范围时,该值将不再存在于内存中。我实际上没有尝试过编译和运行这个,所以我不确定编译器是否会生气或结果究竟是什么,但我知道它不会很好:
long int& operator [] (long int i) {
long int a = i + 5; //arbitrary change
return a;
}
在这种情况下,您将返回对a
位置的引用,但由于在函数完成执行后超出范围,引用不再指向任何内容。在函数退出后,返回引用的变量必须仍然存在。