当前位置: 首页 > 知识库问答 >
问题:

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

澹台臻
2023-03-14

我是C语言的新手,正在寻找关于以下问题的建议。我正试图创建一个程序,生成树的形状(是的,真正的树)。这些形状完全由树枝构成。为此,我开始编写一个名为Branch的类。主要的想法是。cpp I创建一个类Branch的实例,它本身将创建Branch的实例。这适用于层数迭代

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

main.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;
}

现在,这个程序可以工作,但是我想通过将每个对象存储在一个向量中来跟踪所有的分支对象。在程序的最后,allBranches确实是大小NUMBER_OF_LEVELS,因为它应该是(为简单起见,每个对象只有一个子对象)。当我试图提取的孩子或父main.cpp,然而,程序崩溃给出错误:终止调用抛出一个实例的'std::bad_alloc'什么(): std::bad_alloc

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

共有2个答案

易波涛
2023-03-14

主要的想法是。cpp I创建一个类Branch的实例,它本身将创建Branch的实例。

请参见类是否可以自引用?。

郭胤
2023-03-14

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

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

这就够了

小事:

  • 在头文件中使用指令——将它们限制为。cpp文件
  • 无正当理由使用后加值

这份名单并不全面

 类似资料:
  • 我有java中的类:。和类,它扩展了类。 Class保留Class的实例。 我注意到,当我调用类B的构造函数时(当我在类A中初始化这个参数时),它会执行super(),创建一个新的实例A,并初始化所有It字段。 我如何告诉class

  • 本文向大家介绍C#中子类调用父类的实现方法,包括了C#中子类调用父类的实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中实现子类调用父类的方法,分享给大家供大家参考之用。具体方法如下: 一、通过子类无参构造函数创建子类实例 创建父类Person和子类Student。 在客户端通过子类无参构造函数创建子类实例。 输出结果: 可见:通过调用子类无参构造函数创建子类实例,会默认调用父

  • 本文向大家介绍python中子类继承父类的__init__方法实例,包括了python中子类继承父类的__init__方法实例的使用技巧和注意事项,需要的朋友参考一下 前言 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的 初始化 。 注意:这个名称的开始和结尾都是

  • 为什么我们不能在子类B中声明一个实例方法,它与父类a中的静态方法共享相同的签名? 在上面的代码中,由于A没有该名称的实例方法,并且由于Java允许对象访问静态方法,所以指向B的类型为A的对象A可以调用它中存在的静态方法(类A)。但是编译器抛出一个错误“实例方法不能重写静态方法”为什么? 注意:我可以理解,如果一个类不允许两个方法使用相同的方法名,即使其中一个是实例,另一个是静态的。但是我不明白为什

  • 问题内容: 考虑以下类: 由于多个的声明,in 的声明不应该给出编译错误吗? 问题答案: 阴影 (或 隐藏物 )。 这是合法的Java,但应避免使用。我希望您的IDE可以为您提供警告。 但是请注意,这只是一个问题,因为您已经向世界公开了一个 变量 。如果确保所有变量都是私有变量(将方法的API与字段的实现分开),那么父级和子级都具有相同的字段名就没关系- 子级不会仍然能够看到父母的字段。如果将方法

  • 我想创建一个抽象的父类,其中包含方法公共抽象使用();和使用方法在不同的子类是不同的,但利用父方法的所有Rest,但我希望父类包含一个私有变量,但它需要设置从特定的孩子取决于孩子所以像我有一个家长车,我想与汽车一般工作,但为特定目的的use()方法和设置汽车图像我使用保时捷类这是一个孩子。我不希望汽车图像属性是可访问的,但同时如果它的私人我不能从子构造函数设置它,有什么想法吗?我的问题是如何设置一