Неполный тип - PullRequest
       5

Неполный тип

2 голосов
/ 11 марта 2011

Я получаю ошибку неполного типа для переменных 'next' и 'previous'. Я не уверен, что я делаю неправильно, потому что я очень увлечен написанием классов на C ++. Любая помощь будет оценена! Спасибо.

#include<iostream>

using namespace std;

class LinearNode
{
    public:
        //Constructor for the LinearNode class that takes no arguments 
        LinearNode();
        //Constructor for the LinearNode class that takes the element as an argument
        LinearNode(int el);
        //returns the next node in the set.
        LinearNode getNext();
        //returns the previous node in the set
        LinearNode getPrevious();
        //sets the next element in the set
        void setNext(LinearNode node);
        //sets the previous element in the set
        void setPrevious(LinearNode node);
        //sets the element of the node
        void setElement(int el);
        //gets the element of the node
        int getElement();

    private: 
        LinearNode next;
        LinearNode previous;
        int element;        
};//ends the LinearNode class

Файл реализации:

#include<iostream>
#include"LinearNode.h"

using namespace std;

//Constructor for LinearNode, sets next and element to initialized states
LinearNode::LinearNode()
{
    next = NULL;
    element = 0;
}//ends LinearNode default constructor

//Constructor for LinearNode takes an element as argument.
LinearNode::LinearNode(int el)
{
    next = NULL;
    previous = NULL;
    element = 0;
}//ends LinearNode constructor

//returns the next element in the structure
LinearNode::getNext()
{
    return next;
}//ends getNext function

//returns previous element in structure
LinearNode::getPrevious()
{
    return previous;
}//ends getPrevious function

//sets the next variable for the node
LinearNode::setNext(LinearNode node)
{
    next = node
}//ends the setNext function

//sets previous for the node
LinearNode::setPrevious(LinearNode node)
{
    previous = node;
}//ends the setPrevious function

//returns element of the node
LinearNode::getElement()
{
    return element;
}//ends the getelement function

//sets the element of the node
LinearNode::setElement(int el)
{
    element = el;
}//ends the setElement function

тестовый файл:

    #include<iostream>
#include"LinearNode.h"

using namespace std;

int main()
{
    LinearNode node1, node2, move;
    node1.setElement(1);
    node2.setElement(2);

    node2.setNext(node1);
    node1.setPrevious(node2);

    move = node2;

    while(move.getNext() != NULL)
        cout << move.getElement() << endl;

}

Ответы [ 4 ]

14 голосов
/ 11 марта 2011

Ваш тип имеет рекурсивное определение, которое запрещено.

class LinearNode
{
private: 
    LinearNode next;
    LinearNode previous;
};

Элементы данных next и previous являются экземплярами (не ссылками или указателями) класса LinearNode, которыйеще не определено полностью.

Вы, вероятно, хотите это:

class LinearNode
{
private: 
    LinearNode * next;
    LinearNode * previous;
};
4 голосов
/ 11 марта 2011

Вам необходимо указать тип возвращаемого значения для всех ваших функций .cpp.например:

    //returns previous element in structure
LinearNode LinearNode::getPrevious()
{
    return previous;
}//ends getPrevious function
0 голосов
/ 11 марта 2011

может показаться, что вы пытаетесь внедрить «связанный список»

Структура связанной - это следующая и предыдущая «точки» (*), а на самом деле это не другой узел, как утверждает Андре.

http://www.cplusplus.com/doc/tutorial/pointers/ может помочь уточнить.

class LinearNode
{
//...snip
//returns the next node in the set.
LinearNode* getNext();
//returns the previous node in the set
LinearNode* getPrevious();

//...snip
private: 
    LinearNode * next;
    LinearNode * previous;
};

Итак, в файле реализации:

//returns the next element in the structure
LinearNode* LinearNode::getNext()
{
    return next; // now a poiner
}//ends getNext function

//returns previous element in structure
LinearNode*  LinearNode::getPrevious()
{
    return previous; // now a poiner
}//ends getPrevious function

//sets the next variable for the node
void LinearNode::setNext(LinearNode* node) //pointer in, void out
{
    next = node
}//ends the setNext function

//sets previous for the node
void LinearNode::setPrevious(LinearNode* node)//pointer in, void out
{
    previous = node;
}//ends the setPrevious function

, поэтому main выглядит так:

int main()
{
    LinearNode node1, node2, move;
    node1.setElement(1);
    node2.setElement(2);

    node2.setNext(&node1); // give the address of node to the next pointer (&)
    node1.setPrevious(&node2); // give the address of node to the next pointer (&)

    move = node2;

    while(move.getNext() != NULL)
        cout << move.getElement() << endl;

}

Я не знаю, что пытается сделать цикл while!если - возможно?

Кроме того, как заявляет Никламорт, все функции вашего класса должны иметь возвращаемый тип, кроме случая void.

0 голосов
/ 11 марта 2011

Ваши члены типа LinearNode являются экземплярами, которые им не разрешены в этом контексте. Помните, что в C ++, если вы объявляете «Foo f», это не ссылка на объект кучи, как в C #, а экземпляр Foo прямо в стеке или в макете вашего класса.

Еще хуже, эти два экземпляра LinearNode будут созданы , когда будет создан экземпляр их содержащего экземпляра. И у каждого из них есть два дочерних экземпляра, которые также будут созданы, и у каждого из них есть два ... И так далее, и так далее, пока у вас не закончится память. Естественно, вам не разрешено это делать, потому что это не имеет смысла.

Так что это должны быть указатели или ссылки. Причина в том, что размер этих двух экземпляров должен быть известен компилятору для определения размера класса LinearNode, но этот размер должен быть известен до того, как будет известен их размер.

...