C++ 关于初始化内部类实例的问题

C++ 关于初始化内部类实例的问题,c++,constructor,C++,Constructor,LinkedList(int-data):start(newlistnode(data)){}中有错误。 它表示“不能使用LinkedList::ListNode构造初始化LinkedList*值”。 确切的问题方法和解决方案是什么?您不能在包含类的外部正向声明内部类。因此,请尝试先声明它,然后声明指向它的指针: class ListNode; class LinkedList { private: ListNode* start; class ListNode {

LinkedList(int-data):start(newlistnode(data)){}
中有错误。 它表示“不能使用LinkedList::ListNode构造初始化LinkedList*值”。
确切的问题方法和解决方案是什么?

您不能在包含类的外部正向声明内部类。因此,请尝试先声明它,然后声明指向它的指针:


class ListNode;

class LinkedList {

private:

    ListNode* start;

    class ListNode {
    private:
        int data;
        ListNode* next;

    public:
        ListNode() : data(-1), next(NULL) {}
        ListNode(int data, ListNode* next=NULL) : data(data), next(next) {}

    };


public:
    LinkedList() : start(NULL) {}
    LinkedList(int data) : start(new ListNode(data)) {}
};

不能在包含类的外部正向声明内部类。因此,请尝试先声明它,然后声明指向它的指针:


class ListNode;

class LinkedList {

private:

    ListNode* start;

    class ListNode {
    private:
        int data;
        ListNode* next;

    public:
        ListNode() : data(-1), next(NULL) {}
        ListNode(int data, ListNode* next=NULL) : data(data), next(next) {}

    };


public:
    LinkedList() : start(NULL) {}
    LinkedList(int data) : start(new ListNode(data)) {}
};

类ListNode的正向声明
与后面定义的class
LinkedList::ListNode不同

当编译器找到
ListNode*start时
LinkedList::ListNode
未知,因此编译器使用
ListNode
转发声明。当编译器开始时(新的ListNode(数据))
LinkedList::ListNode
是已知的,并且具有更近的作用域,因此使用它而不是
ListNode

结果:
start
,一个
ListNode*
指向一个
LinkedList::ListNode
。类型冲突,编译器拒绝代码


最简单的解决方案是删除ListNode的转发声明,因为它可能只是试图修复早期未声明的标识符错误,并且永远不会被定义,然后移动
ListNode*start
在定义
LinkedList::ListNode
之后,这样就不会有歧义。

类ListNode的前向声明与后面定义的class
LinkedList::ListNode不同

当编译器找到
ListNode*start时
LinkedList::ListNode
未知,因此编译器使用
ListNode
转发声明。当编译器开始时(新的ListNode(数据))
LinkedList::ListNode
是已知的,并且具有更近的作用域,因此使用它而不是
ListNode

结果:
start
,一个
ListNode*
指向一个
LinkedList::ListNode
。类型冲突,编译器拒绝代码


最简单的解决方案是删除ListNode的转发声明,因为它可能只是试图修复早期未声明的标识符错误,并且永远不会被定义,然后移动
ListNode*start
在定义了
LinkedList::ListNode之后执行,这样就不会有歧义。

更好:最简单的修复方法是移动
ListNode*start
类列表节点{…}之后
(并删除向前声明
类ListNode;
,该声明完全错误)。更好:最简单的修复方法是移动
ListNode*开始
类列表节点{…}之后(并删除转发声明
类ListNode;
,这完全是错误的)。。。更确切地说,您不能在包含类的外部正向声明内部类。但是你可以在包含类中完成。我会对它进行编辑,以便将来的访问者更清楚。嗯。。。更确切地说,您不能在包含类的外部正向声明内部类。但您可以在包含类中进行编辑。我将对其进行编辑,以便将来的访问者能够更清楚地看到它。