我有2个课程classNode
和classTree
。
在我的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.
}
答案 0 :(得分:3)
如果我现在得到了这个场景(显示代码会有很多帮助)
您不应在构造函数中创建vector<classNode> nodes
,而应将其作为classTree
的成员。这也适用于root
。
==编辑==
现在看到你的代码后,你应该把它改成:
你应该将vector<ClassNode> nodes;
移动到头文件中的类。
如果你不能改变标题(这是一个类作业吗?)你应该通过left
结构中的right
和nodeInfo
指针改变你构建标题的方式。拥有根的方式将使您获得对所有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的成员指针。 一旦构造函数返回,指针就会变为无效。它在堆栈上 - 它不再是。