2013-04-21 211 views
0

我的函数get_num返回变量long int错误:无法从'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 
+5

为什么你首先返回一个整数的引用?此外,返回一个本地自动变量的引用是UB。 – 2013-04-21 19:03:24

+5

@ H2CO3返回一个引用对于运算符[]' – 2013-04-21 19:04:41

+4

@DavidHeffernan是完全正常的,但不是对_local_变量的引用。 – 2013-04-21 19:05:37

回答

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 intlong 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位置的引用,但由于函数完成执行后超出范围,引用不再指向任何内容。在函数退出后,您要返回参考的变量仍然存在。

+0

我有:p =“1/2x”,我正在尝试:p [1] = 3(输出应该是:“3/2x” int [1](long int'1'),但它不会将'3'替换为'1'。我该如何修复它? – 2013-04-21 19:36:15

+0

get_num是否返回'long int'或'long int&'?这两者之间有一个重要的区别,我将在我的答案中详细说明。 – Danny 2013-04-21 19:39:18

+0

get_num返回ns'long int'和我的操作符中我写道:long int nom = getnom(i); long int&r_nom = nom;返回r_nom; – 2013-04-21 19:41:09

1

的编译错误是此行

int& b = a; 
^^^^ 

应该

long int& b = a; 
^^^^^^^^ 

而且,正如朋友在评论中所说的那样,返回对局部变量的引用会导致未定义的行为,因为引用的变量在退出函数后将被销毁。

盲目倾向,如果get_num正确返回引用,则可能需要返回对get_num的引用。

return get_num(i); 
相关问题