在C ++中访问构造函数

时间:2013-04-13 18:28:04

标签: c++ oop class constructor

我正在尝试使用类Node创建一个Node对象:

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

课程结束后向下移动main()

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

我对C ++有些新意,所以任何提示都会受到赞赏。

5 个答案:

答案 0 :(得分: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

您对maptotalNodes的未定义引用的原因是: 类的静态成员必须在类外初始化。因此,当内联构造函数尝试访问它们时,它们不会被定义。所以你有未定义的参考。

您应该执行以下操作:

 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);
}

答案 1 :(得分:3)

您在使用后声明Node。只需在main之前移动声明就可以了:

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

您还可以对该类执行forward-declaration(没有定义的标识符声明):

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

答案 2 :(得分:1)

您需要在主要使用位置之前放置Node声明 仅提出声明是不够的,因为main中的新Node需要声明Node 对于未解析的外部,您需要定义Node :: totalNodes

int Node::totalNodes = 0;

答案 3 :(得分: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

答案 4 :(得分:1)

只需为第一行打开以下行:

class Node;