【问题标题】:Cannot assign one pointer to another because of type mismatch, or so the compiler says由于类型不匹配,无法将一个指针分配给另一个指针,或者编译器说
【发布时间】:2013-03-20 21:03:17
【问题描述】:

这里是头文件代码,stack.h:

#include <iostream>
using namespace std;
//template <class T> struct stackNode;
//template <class T>
struct stackNode {
int item;
stackNode *Next;
stackNode *Prev;
//stackNode *Temp;

};
class stackClass {
public:
stackClass();
stackClass(const stackClass &right);
~stackClass();
stackClass &operator=(const stackClass &right);
int counter;
int StackIsEmpty(void);
//stackNode *origptr;
void push( int item, bool &success);
int pop(void);

int GetStackTop(void);

protected:
stackNode *GetStackTopPtr(void);


private:

stackNode *Top;
stackNode *Current;
//stackNode *origptr;
//stackNode<T> *Next; 
};

这里是实现文件stack.cpp:

#include "stack.h"

//constructor 
stackClass::stackClass(){
        Top = NULL;
        int counter = 0;
            }   

//copy constructor
stackClass::stackClass(const stackClass &right){
        if (right.Top == NULL){
        Top = NULL;
        counter = 0;
            }
        else {
            stackNode * origptr = right.GetStackTopPtr; 
        stackNode * currptr;
        Top = new stackNode; 
        currptr = Top;

        while(origptr->Next != NULL){
            currptr->item = origptr->item;
            origptr = origptr->Next;
            currptr->Next = new stackNode;
            currptr->Next->item = origptr->item;
            currptr = currptr-> Next;
            }
        currptr->Next = NULL;
            }   
    }

//Destructor
stackClass::~stackClass(){  
    while (Top != NULL){
        pop();
                    }               
            }
//push
void stackClass::push(int item, bool &success){
    success = false;
    if (Top == NULL){
        Top = new stackNode;
        Top -> item = item;
        Top -> Next = NULL;
        Top -> Prev = NULL;
        Current = Top; 
        counter++;
        success = true;
        }
    else {
        stackNode * Temp = new stackNode;
        Current -> Next = Temp;
        Temp -> Prev = Current;
        Temp -> Next = NULL; 
        Current = Temp;
        Current -> item = item;
        counter++;
        success = true;
        }

    }

int stackClass::pop(void){      

    if (Top == NULL){
        cout<<"Stack is empty"<<endl;
        }   

    else if (counter == 1){
        Top = NULL;
        delete Current; 
        counter--;
        }

    else if(counter > 1){
        Current -> Prev -> Next = NULL;
        Current = Current -> Prev;
        stackNode * Temp = Current -> Next;
        delete Temp; 
        counter--;              
        }   
    }   

int stackClass::StackIsEmpty(void){
    if (counter == 0)
        return 1;
    else 
        return 0;
    }

int stackClass::GetStackTop(void){

    int item = Top->item ; 
    return item;    
            }   

stackNode *stackClass::GetStackTopPtr(void){
    return Top;         
            }   

这就是问题所在,

stack.cpp:在复制构造函数'stackClass::stackClass(const stackClass&)'中:
stack.cpp:19:31:错误:无法将“stackClass::GetStackTopPtr”从类型“stackNode* (stackClass::)()”转换为类型“stackNode*”

我不知道为什么编译器会抱怨,似乎在有问题的行中,在 stack.cpp 第 19 行,right.GetStackTopPrt 将返回一个 stackNode * 类型,它应该很好地分配给 stackNode* on左边。

如果您知道问题所在,请提供帮助。谢谢!

【问题讨论】:

    标签: c++ class pointers stack assign


    【解决方案1】:

    你正在尝试设置

    stackNode * origptr = right.GetStackTopPtr;
    

    左侧是stackNode 指针,右侧是函数 GetStackTopPtr。我想你的意思是写:

    stackNode * origptr = right.GetStackTopPtr(); // Note the parentheses!
    

    请记住,编译器非常擅长识别类型,并且几乎总是正确地处理这些事情。不要假设编译器错了,先找你犯的错误!

    【讨论】:

    • 谢谢。我并没有真正抱怨编译器在抱怨,我只是说它这样做了。
    • @radashevskiy 啊,很公平。我同意阅读编译器错误消息是一门艺术。这解决了问题吗?
    • 这当然是一个很大的疏忽,感谢您指出这一点。但是,在我修复之后,该行仍然存在问题,因此我不得不在头文件和实现文件中的 stackNode *GetStackTopPtr(void) 末尾添加单词 const 。还必须修复 pop() 以返回弹出节点的值。还有很多工作要做!
    猜你喜欢
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    相关资源
    最近更新 更多