1

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

目前,该程序的结构如下:

主.cpp:

#include "branch.h"

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

分支.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();
};

分支.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现在,这个程序可以工作了,但我想通过将每个对象存储在vector,中来跟踪所有对象allBranches。在程序结束时,allBranches确实是 size NUMBER_OF_LEVELS,因为它应该是(为简单起见,每个对象只有 1 个孩子)。但是,当我尝试从 main.cpp 中提取子级或父级时,程序崩溃并显示为错误:terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc

我想知道这是否是由于static关键字使用错误引起的?在 C++ 中创建父/子结构的正确方法是什么?

4

2 回答 2

0

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

请参阅一个类可以自引用吗?.

于 2013-06-02T01:15:09.360 回答
0

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

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

这已经足够了

小事:

  • using 头文件中的指令——限制为 .cpp 文件
  • 无正当理由使用后增量

这份清单并不全面

于 2013-06-02T00:17:52.753 回答