在C++中访问构造函数

Accessing constructor in C++

本文关键字:构造函数 访问 C++      更新时间:2023-10-16

我正在尝试使用类 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++有点陌生,所以任何提示将不胜感激。

你必须用

结束你的类定义 ;

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

同时,您需要在main之前进行Node声明。

还有一点:

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

您在使用后声明Node。只需将声明移到main之前,您应该很好:

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

您还可以对类执行前向声明(不带定义的标识符声明(:

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

你需要做一个Node的前向声明,比如

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

或者在定义class Node后放main.

只需将

以下行作为第一行:

class Node;

你需要把 Node 声明放在使用它的 main 之前。
仅仅提出声明是不够的,因为 main 中的新节点需要声明 Node。
至于未解析的外部,你需要定义 Node::totalNodes

int Node::totalNodes = 0;