【问题标题】:Identifier not found for member function未找到成员函数的标识符
【发布时间】:2014-04-11 19:35:13
【问题描述】:

由于某种原因,每当我尝试使用 appendNode() 时,都会不断收到“找不到标识符”错误。此外,我不断收到一个错误,告诉我我缺少“;”在“使用”之前没有任何意义。

头文件

#ifndef INTEGERLIST_H
#define INTEGERLIST_H
#include <iostream>
using namespace std;

class IntegerList
{
private:
    struct ListNode
    {
        int value;
        struct ListNode *next;
    };

    ListNode *head;

public:
    IntegerList()
    {
        head = NULL;
    }

    ~IntegerList();

    void appendNode(int);
    void insertNode(int);
    void deleteNode(int);
    void printList() const;
}
#endif

实现文件

#include "IntegerList.h"
#include <iostream>
using namespace std;


void IntegerList::appendNode(int num)
{
    ListNode *newNode;
    ListNode *nodePtr;

    //new allocation
    newNode = new ListNode;
    newNode->value = num;
    newNode->next = NULL;

    if (!head)
        head = newNode;

    else
    {
        nodePtr = head;

        while(nodePtr->next)
            nodePtr = nodePtr->next;

        nodePtr->next = newNode;
    }
}

void IntegerList::insertNode(int num)
{
    ListNode *newNode;
    ListNode *nodePtr;
    ListNode *previousNode = NULL;

    newNode = new ListNode;
    newNode->value = num;

    if(!head)
    {
        head = newNode;
        newNode->next = NULL;
    }
    else
    {
        nodePtr = head;

        previousNode = NULL;

        while(nodePtr != NULL && nodePtr->value < num)
        {
            previousNode = nodePtr;
            nodePtr = nodePtr->next;
        }

        if(previousNode == NULL)
        {
            head = newNode;
            newNode->next = nodePtr;
        }
        else
        {
            previousNode->next = newNode;
            newNode->next = nodePtr;
        }
    }
}

void IntegerList::deleteNode(int num)
{
    ListNode *nodePtr;
    ListNode *previousNode;

    if(!head)
        return;

    if(head->value == num)
    {
        nodePtr = head->next;
        delete head;
        head = nodePtr;
    }

    else
    {
        nodePtr = head;

        while(nodePtr != NULL && nodePtr->value != num)
        {
            previousNode = nodePtr;
            nodePtr = nodePtr->next;
        }

        if(nodePtr)
        {
            previousNode->next = nodePtr->next;
            delete nodePtr;
        }
    }
}

void IntegerList::printList() const
{
    ListNode *nodePtr;

    nodePtr = head;

    while(nodePtr)
    {
        cout << nodePtr->value << endl;

        nodePtr = nodePtr->next;
    }
}

【问题讨论】:

  • 从不在标头中放置 using 指令。没有人想包含一个标题并突然得到std
  • 您在课程结束时缺少一个分号。
  • 也许你有一个臭名昭著的错误,即在你的类声明之后缺少;。我记得在大学时被警告过。

标签: c++ oop object linked-list header-files


【解决方案1】:

#include 直接从另一个文件复制,由于这是由预处理器完成的,编译器并不真正知道发生了这种情况,并给你错误,就好像它只是一个大文件一样。所以在你的代码中你有(简化如下):

// header.h
class A{
   // ...
}

// code.cpp
#include "header.h"
using namespace std;

所以这被转换为:

// code.cpp
class A{
   // ...
}
using namespace std;

这使错误更清楚。因为类声明必须以 ; 结尾,所以在 using 之前需要 ;

【讨论】:

    【解决方案2】:

    如 cmets 中所述,您在类声明末尾缺少 ;。您在实现文件中遇到错误,因为在您的 using 语句之前包含(完整复制)标头。一旦你知道你在看什么,那就很有意义了。

    【讨论】:

      【解决方案3】:

      正如其他人已经说过的,您在标题中的类声明末尾缺少;

      然而,代码中更严重的问题是标题中的using namespace std; 行。这是bad practice,但在头文件中尤其是。唯一使用std 中任何内容的行是printList 中的单行

          cout << nodePtr->value << endl;
      

      删除两个using namespace std 行并将printList 中的行替换为:

          std::cout << nodePtr->value << std::endl;
      

      您和以后可能使用您的代码的其他所有人都会感谢您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-09
        • 2016-07-25
        • 2014-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多