2013-04-13 3 views
1

Я пытаюсь создать объект Node с помощью класса Node:Доступ к конструктору в C++

int main(){ 
    for(int i=0; i< 20; i++) 
     Node *handle = new Node(i, 10); 
} 

class Node{ 
public: 
    static vector<Node> map; 
    static int totalNodes; 
    vector<Node> connections; 
    int NodeID; 

    Node(int ID, int weight){ 
    NodeID = ID; 
    CreateConnections(weight); 
    totalNodes++; 
    map.push_back(*this); 
} 

По некоторым причинам я получаю

'Node' : undeclared identifier 
'Node' handle : undeclared identifier 
syntax error : identifier node 

Перемещение основной() вниз после того, как класс дает мне

unresolved external symbol 
for Node::map and Node::totalNodes 

Я немного новичок в C++, поэтому любые советы будут оценены.

ответ

5

Вы должны закончить определение класса с;

class Node 
{ 
    //.... 
    map.push_back(*this); 
}; //^^^Cannot miss ; 

Между тем, вы должны поместить декларацию Node перед тем main.

Еще один момент:

Node(int ID, int weight){ 
    NodeID = ID; 
    CreateConnections(weight); 
    totalNodes++; 
    map.push_back(*this); 
}//missing closing } on constructor definition 

Причина, по которой вы неопределенная ссылка на map и totalNodes потому, что: статические члены класса должны быть инициализированы вне класса. поэтому, когда встроенный конструктор пытается получить к ним доступ, они не определены. поэтому у вас есть неопределенная ссылка.

Вы должны сделать что-то вроде следующего:

class Node{ 
public: 
    static vector<Node> map; 
    static int totalNodes; 
    vector<Node> connections; 
    int NodeID; 
    Node(int ID); 
}; 


int Node::totalNodes = 0; //definition of static variables 
vector<Node> Node::map; 

//^^^define constructor outside class body 
Node::Node(int ID){ //your second parameter for ctor not used, so remove it 
    NodeID = ID; 
    totalNodes++; 
    map.push_back(*this); 
} 
+0

Я думаю, что вы имели в виду заявление вместо определения. –

+0

Хорошо, я добавил 'class Node;' перед main и добавил точку с запятой в конце конструктора, теперь она дает мне нерешенную внешнюю ошибку, указанную в моем вопросе. Извините за закрытие скобки, я не вставлял функции-члены и забыл}; –

+0

@StevenMorad см. Мое обновленное сообщение? – taocp

1

Необходимо указать объявление узла перед основным, где оно используется.
Простое объявление объявления недостаточно, так как новый узел в главном объявлении должен объявлять узел.
Что касается неразрешенного внешнего, вам нужно определить Node :: totalNodes

int Node::totalNodes = 0; 
3

Вы объявляем Node после его использования. Просто переместите декларацию до main и вы должны быть хорошо:

class Node { ... }; 
int main() { ... } 

Вы также можете сделать forward-declaration (объявление для идентификатора без определения) класса:

class Node; 
int main() { ... } 
class Node { ... }; 
1

Вы или должны сделать предобъявление из Node как

class Node; 

int main(){ 
    for(int i=0; i< 20; i++) 
    Node *handle = new Node(i, 10); 
} 

class Node { }; //impelementation 

или положить main после определения class Node.

+0

Это не сработает, чтобы создать новый узел с новым, для которого требуется конструктор. – alexrider

+0

Глупости! Это простое объявление, это просто имя класса. Компилятор сделает все остальное. –

+0

http://liveworkspace.org/code/2wbHmQ$0 source.cpp: 8: 34: error: недопустимое использование неполного типа 'class Node' – alexrider

1

Просто затыкать следующую строку для первой строки:

class Node; 
Смежные вопросы