2013-11-20 4 views
0

Первый раз здесь. Я новичок в C++ и много часов пытался вычислить это. Извините, что вопрос, который кажется общим. Я не мог найти ответ на всю жизнь.Невозможно создать экземпляр абстрактного класса, но у меня есть

Я получаю следующее сообщение об ошибке компиляции в визуальной студии:

error C2259: 'Node' : cannot instantiate abstract class 
due to following members: 
'void Node::printValue(void)' : is abstract. 

Это мое понимание того, что это означает чистую виртуальную функцию, которую я создал не был реализован в дочернем классе. Из всего, что я вижу, он был реализован в дочернии intNode. Что я здесь делаю неправильно? Код ниже. Заранее спасибо!

В node.h:

class Node {    
protected: 
    Node* nextNodePtr; 

public: 
    Node(); 
    Node* getNextNodePtr(void); 
    void setNextNodePtr(Node*); 
    ~Node(); 
    virtual void printValue() = 0; 
}; 

class intNode : public Node { 
    int nodeInteger;  
public: 
    virtual void printValue() 
    { 
     cout << "***" << endl; 
    } 

    intNode(int i) 
    { 
     nodeInteger = i; 
    } 
}; 

В node.cpp:

void intNode::printValue() 
{ 
    cout << "It's an int: " << nodeInteger << endl; 
} 

void Node::printValue() 
{ 
    cout << "This is just here fix compile error" << nodeInteger << endl; 
} 

Edit ... извините, я забыл добавить этот бит. Ошибка указана на этот раздел в главном

int main() 
{ 
Node* firstNode = new Node;  <---- this line is where the error points 
firstNode = new intNode; 
intNode* intNode = new intNode; 
+0

Где код, вызывающий ошибку? И почему вы определяете 'intNode :: printValue()' дважды? И почему вы (пытаетесь) использовать 'nodeInteger' в члене' Node'? – Mat

+0

У вас, похоже, есть два определения 'intNode :: printValue()' (один встроенный в заголовке и один в Node.cpp). Вероятно, это приведет к ошибке во время соединения, но я сомневаюсь, что это вызывает тот, который вы видите. Это может показаться глупым, но вы уверены, что пытаетесь создать 'intNode', а не' Node'? –

+1

Помимо всех упомянутых ошибок, я предполагаю, что вы пытаетесь создать экземпляр узла, но узел является абстрактным. Использовать Node * node = new intNode (5); Не используйте узел Node node = intNode ... –

ответ

2

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

int main() 
{ 
Node* firstNode; // do not create Node instance here. 
       // It's a compile time error and even if not, 
       // it would have been a memory leak. 

firstNode = new intNode; 
intNode* intNode = new intNode; 
0

Данное заявление неверно.

Полагаю, что это означает, что чистая виртуальная функция, которую я создал, не была реализована в дочернем классе.

Ошибка означает, что void Node::printValue(void) является чисто виртуальным (т.е. void foo() = 0) в Node class. Это делает класс Node абстрактным. Поскольку вы не можете создавать абстрактные классы, вы видите ошибку.

Кроме того, как уже упоминалось в комментариях, вы определили void intNode::printValue() дважды. Это неверно.

+0

Вы можете предоставить определение для чистого виртуального метода на C++, чтобы производный класс вызывал реализацию родительского класса. –

+0

@TristanBrindle Спасибо, что преподал мне. Исправлена. – xslr

Смежные вопросы