C ++,同一类中的类的实例,类中的父/子结构

时间:2013-06-01 23:56:03

标签: c++ static parent instantiation iteration

我对C ++很陌生,并在寻找以下问题的建议。我正在尝试创建一个生成树形状的程序(是的,真正的树)。这些形状完全由分支构建。为此,我开始编写一个名为Branch的类。我的想法是在main.cpp中创建一个类Branch的实例,它本身将创建Branch的实例。这继续NUMBER_OF_LEVELS次迭代。

目前,该计划的结构如下:

main.cpp中:

#include "branch.h"

int main()
{
    Branch tree;
    return 0;
}

Branch.h:

#include <iostream>
#include <vector>
#include <stdlib.h>
#include <cmath>

using namespace std;

const double NUMBER_OF_LEVELS=4;

static int nodecounter=0;

struct Branch
{    
public:
    int level;
    int nodenumber;

    vector<Branch> children;
    Branch *parent;

    Branch(int lvl,Branch p);
    Branch();
    static vector<Branch> getAllBranches();
};

Branch.cpp:

#include "Branch.h"

static vector<Branch> allBranches;

Branch::Branch(int lvl,Branch p)
{
    level=lvl;
    parent=&p;

    nodenumber=nodecounter;
    nodecounter++;
    allBranches.push_back(*this);

    if (lvl>1)
    {
        children.push_back(Branch(level-1,*this));
    }
}

//root
Branch::Branch()
{
    level=NUMBER_OF_LEVELS;

    nodenumber=nodecounter;
    nodecounter++;
    allBranches.push_back(*this);

    children.push_back(Branch(level-1,*this));
}

vector<Branch> Branch::getAllBranches()
{
    return allBranches;
}

现在,这个程序可以正常运行,但我想通过将每个Branch对象存储在vectorallBranches来跟踪所有allBranches个对象。在程序结束时,NUMBER_OF_LEVELS确实大小为terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc,因为它应该是(为简单起见,每个对象只有1个子项)。但是,当我尝试从main.cpp中提取子级或父级时,程序会因错误而崩溃:static

我想知道这是否是由{{1}}关键字的错误使用造成的?在C ++中创建父/子结构的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

你有很多问题,我发现的前几个问题:

  • 头文件中的静态变量:您不太可能想要使用不同的副本感染每个TU
  • 结构中的父指针没有任何处理和结构;存储在向量中:风险太大,最终无法使用悬空指针。当您添加更多项目时,向量中的指针无效!
  • 一个非常奇怪的ctor,按值使用相同的类型
  • 将父指针设置为作为参数发送的临时副本的地址:显然,您的意思是传入指向某个稳定节点的指针

这足够showstoppers

小事:

  • 在头文件中使用指令 - 将其限制为.cpp文件
  • 在没有充分理由的情况下使用后增量

该列表并不是全面的

答案 1 :(得分:0)

  

我的想法是在main.cpp中我创建了一个类Branch的实例,   它本身将创建Branch的实例。

请参阅Can a Class be self-referenced?