当我尝试使用指针的别名时,g ++返回错误

时间:2017-10-21 23:03:01

标签: c++ pointers nodes

我正在尝试创建一个变量,它是Node指针的别名。

到目前为止,我尝试了以下语法:

debugger

&安培;

node* _p = &p;

每当我尝试调用类函数(即_p-> getdata())或甚至引用都使用别名(if(_p == NULL))时,我会收到错误消息:

node* &_p = p;

我也试过把*或&在_p之前,我打电话给它,但它没有帮助。

注意:我正在使用g ++进行编译

一个最小的,完整的,可验证的例子(我认为): 错误发生在列表类的插入函数内...

error: expected primary-expression before ‘;’ token
             node* newnode = _p;

1 个答案:

答案 0 :(得分:1)

if (a == 1) node* &list = L1;
else if (a == 2) node* &list = L2;

list的范围是ifelse if。它在其他任何地方都不存在。这是带有大括号的代码,可以使问题更加明显:

if (a == 1) 
{
    node* &list = L1;
}
else if (a == 2) 
{
    node* &list = L2;
}

由于引用只能在初始化时就位,因此您必须将逻辑移到其他位置。代码的结构并不容易。

幸运的是,您似乎不需要将其作为参考。在这里使用常规指针。

    node* list;
    if (a == 1) list = L1;
    else if (a == 2) list = L2;

修改

正如退休忍者在评论中指出的那样,list 需要作为参考。在这种情况下,我们必须通过使用函数来选择正确的列表来解决只能访问引用的问题:

node* & getList(int a)
{
    if (a == 1)
    {
        return L1;
    }
    else if (a == 2)
    {
        return L2;
    }
    else
    {
        throw std::runtime_error("not a valid list");
    }
}

请注意失败时抛出的异常。最好在insert以下的某处处理,因为insert无法正确处理它。

修改后的初始化看起来像

node* &list = getList(a);

现在list的范围是该函数,只能坐一次,仍然是引用。