0

我的函数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
4

2 回答 2

1

编译错误是针对这一行的

int& b = a;
^^^^

它应该是

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

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

盲目地回答,get_num如果get_num正确返回引用,您可能需要返回对 的引用。

return get_num(i);
于 2013-04-21T19:09:19.760 回答
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,但由于 a 在函数完成执行后超出范围,因此该引用不再指向任何内容。在函数退出后,您返回引用的变量必须仍然存在。

于 2013-04-21T19:13:20.063 回答