【问题标题】:How do I return a pointer to an Object's Struct with a method?如何使用方法返回指向对象结构的指针?
【发布时间】:2012-10-09 07:16:12
【问题描述】:

我正在尝试用 C++ 为一个名为 List 的自定义列表类编写一个方法。它是一个由节点组成的链表,节点是各种项目。对于该方法,我希望它返回一个指向节点的指针,但会收到一个错误消息,指出“‘节点’没有命名类型。” 请注意,sort() 方法仍在进行中,我正在等待 setMyNext()。

template<class Item>
class List {
public:
List();
List(const List& original);
virtual ~List();
void sort();

List& operator=(const List& original);
bool operator==(const List& original)const;
bool operator!=(const List& l2) const;

private:
void print()const;
unsigned mySize;
struct Node{
    Node();
    Node(Item item, Node * next);
    ~Node();
    void print()const;
    Node * setMyNext(Node * newNext);
    Item myItem;
    Node * myNext;
};

Node * myFirst;
Node * myLast;

friend class ListTester;
};



template<class Item>
List<Item>::List() {
myFirst=NULL;
myLast=NULL;
mySize=0;
}

 template<class Item>
List<Item>::List(const List& original){
myFirst=myLast=NULL;
mySize=0;
if(original.getSize()>0){
    Node * oPtr = original.myFirst;
    while(oPtr!=NULL){
        append(oPtr->myItem);
        oPtr=oPtr->myNext;
    }
}
}

template<class Item>
List<Item>::Node::Node(){
myItem=0;
myNext=NULL;
}


template<class Item>
List<Item>::Node::Node(Item item, Node * next){
myItem=item;
myNext= next;
}

template<class Item>
List<Item>::~List() {
//  cout<<"Deleting List..."<<endl;
delete myFirst;
myFirst=myLast=NULL;
mySize=0;
}

template<class Item>
void List<Item>::sort(){
//get my first 2 items
if(mySize<2)
    return;
Node * compareEarly=myFirst;
Node * compareLate=myFirst->myNext;
//compare
if(compareEarly->myItem > compareLate->myItem){
//If 2<1, set 0's next pointer to 2, set 2's next to 1, set 1's next to 3
    cout<<"big"<<endl;

}
    //This needs a set previous pointer and set next item's pointer

    //increment
}

template<class Item>
Node * List<Item>::Node::setMyNext(Node * newNext){
myNext=newNext;
}

【问题讨论】:

  • 一个建议,对于长代码,正确格式化很重要。我在阅读您的代码时遇到了很多麻烦... :-(

标签: c++ pointers struct return


【解决方案1】:

因为节点没有命名类型。

您在此处尝试引用的节点实际上是您的模板类 List 中的节点。 但是,由于您是在类声明之外定义函数。 该函数的返回类型在全局(或您当前的命名空间)范围内。 因此,为了让编译器找到正确的类型,您需要提供 Node 的全名。

简而言之:

Node * List<Item>::Node::setMyNext(Node * newNext){

这条线是错误的。应该是这个。

typename List<Item>::Node* List<Item>::Node::setMyNext(Node * newNext){

同样适用于您的其他功能...

【讨论】:

  • 我现在收到这些错误:..error: 'Node' in 'class List' 没有命名类型错误:需要 'typename' 在 'List:: Node',因为 'List' 是一个依赖范围
  • @user1673882,哎呀,我的错。忘记需要关键字typename了,因为需要通知编译器Item是模板名,后面会解析。
  • 好吧,成功了。谢谢。另外,您提到了“正确格式化代码”。我真的是 C++ 新手,你能解释一下我做错了什么吗?
  • @user1673882,我的意思是当您在 SO 上发布代码时,请确保正确缩进您的代码。 :)
【解决方案2】:

您的问题是编译器不知道“Node *”的定义是什么,因为函数定义位于全局命名空间中。您需要指定它属于哪个命名空间,以便编译器识别它。

template<class Item>
List<Item>::Node * List<Item>::Node::setMyNext(Node * newNext){
myNext=newNext;
}

【讨论】:

  • 我试过这个,现在它抛出这个:需要在'List::Node'之前'typename',因为'List'是一个依赖范围
猜你喜欢
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 2010-12-01
相关资源
最近更新 更多