c ++构造函数中变量的范围

时间:2013-12-29 09:58:43

标签: c++ pointers scope

我有2个课程classNodeclassTree。 在我的classTree构造函数中,我创建了一个vector<classNode> nodes并推送 返回classNodes个对象。

然后我为第一个成员分配了一个classNode*指针 vector<classNode>

this->root= &nodes[0];

现在退出构造函数后,我的指针显示垃圾,但我必须使用 它。我可以将static vector<classNode> nodes用于此目的吗?或者是 还有人给我任何建议吗?

修改

struct nodeInfo{
    string name;
    int tab;
};
ClassTree(){

    vector<nodeInfo> container;
         vector<ClassNode> nodes;
         //assume that container is a not-empty vector.I removed this part for simplicity.
         for(int i=0;i<container.size();i++){
          nodes.push_back(ClassNode (container[i].name,1));
    }

    this->root=&nodes[0];

}

ClassTree::function2(){

//now I want to use root here. I mean I want to reach &nodes[0] here.
}

2 个答案:

答案 0 :(得分:3)

如果我现在得到了这个场景(显示代码会有很多帮助) 您不应在构造函数中创建vector<classNode> nodes,而应将其作为classTree的成员。这也适用于root

==编辑==

现在看到你的代码后,你应该把它改成:

你应该将vector<ClassNode> nodes;移动到头文件中的类。

如果你不能改变标题(这是一个类作业吗?)你应该通过left结构中的rightnodeInfo指针改变你构建标题的方式。拥有根的方式将使您获得对所有Tree mambers的访问权限。此外,您必须使用new分配新节点,而不是在堆栈上放置参数并指出它们:

struct nodeInfo
{
    string name;
    int tab;
    nodeInfo *left;
    nofeInfo *right;
};

ClassTree(){

    vector<nodeInfo> container;
    vector<ClassNode> nodes;

    for(int i=0;i<container.size();i++)
    {
        nodeInfo newNode = new nodeInfo;// <-- use `new` so it will "live" out side the scope.
        newNode.name = ...;
        newNode.tab = ...;

        //here is the "magic" when you actually need to build the tree.
        //if it's the first one then root should point it.
        //otherwise it should be one of the root's childs
        //but you can't expect me to do everything for you (:
    }

    this->root=&nodes[0];

}

ClassTree::function2(){

//now I want to use root here. I mean I want to reach &nodes[0] here.
}

答案 1 :(得分:1)

根据您的代码,您已将元素推入构造函数的堆栈空间中的向量中。 然后分配了一个指向元素0的成员指针。 一旦构造函数返回,指针就会变为无效。它在堆栈上 - 它不再是。