代码之家  ›  专栏  ›  技术社区  ›  ggkfox

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

  •  1
  • ggkfox  · 技术社区  · 7 年前

    我试图创建一个变量,它是节点指针的别名。

    node* _p = &p;
    

    &

    node* &_p = p;
    

    每当我试图调用一个类函数(即_p->getdata())或甚至引用时,都会使用别名(如果(_p==NULL)),我会得到一个错误,该错误表示:

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

    我也试过把*或&在我呼叫它之前,但这没有帮助。

    注意:我使用g编译++

    一个最小、完整且可验证的示例(我认为): 错误发生在list类的insert函数内。。。

    class node{
    private:
        int data;
        node* next;
        int mark;
    public:
        node(int d = 0, node* n = NULL){
            data = d;
            next = n;
            mark = 0;
        }
        int getdata(){return data;}
        node* getnext(){return next;}
        int getmark(){return mark;}
        void setdata(int x){data = x;}
        void setnext(node* x){next = x;}
        void setmark(int x){mark = x;}
    };
    class list{
    private:
        node* L1; //head pointers to list1, list2, and freelist.
        node* L2;
        node* free;
        node* front;
    public:
        list(){
            front = new node();  //generate free list (empty)
            free = front;
            L1 = NULL;
            L2 = NULL;
            node* p = free;
            for (int i = 1; i < 10; i++){
                p -> setnext(new node());
                p = p -> getnext();
            }
            delete p;
        }
    
        void insert(int a, int x){
            if (free == NULL) {
                cout << a << " is full. can't insert " << x << " into the list." << endl;
                return;
            }
            if (a == 1) node* &list = L1;
            else if (a == 2) node* &list = L2;
            else {
                cout << "not a valid list";
                return;
            }
            if (list == NULL){
                list = free;
                free = free -> getnext();
                list -> setdata(x);
                list -> setnext(NULL);
            }
            else {
                node* p = list;
                while (p -> getnext() != NULL) {p = p -> getnext();}
                p -> setnext(free);
                free = free -> getnext();
                p -> getnext() -> setnext(NULL);
                p -> getnext() -> setdata(x);
            }
        }
    };
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   user4581301    7 年前

    在里面

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

    list 范围在 if else 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;
    

    编辑

    正如退休忍者在评论中指出的那样, 列表

    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 因为 插入

    node* &list = getList(a);
    

    列表 由函数限定范围,只定位一次,仍然是一个引用。