Проблемы с передачей объектов в древовидной структуре

arduino-uno c++ object-oriented

Я новичок в C++ и arduino. Хочу построить объект Tree, но он ведет себя не так, как я ожидал. Вот код:

TreeNode.h

class TreeNode {

  public:
    TreeNode(String inputNodeName);
    TreeNode *children[];
    TreeNode &getChild(int index);
    int getLength();
    String nodeName;
    void addChild(TreeNode &node);
    String getName();

  private:
    int childLength;
};

Узел дерева.cpp

  TreeNode::TreeNode(String inputNodeName) {
    nodeName = inputNodeName;
    childLength = 0;
  }

  TreeNode &TreeNode::getChild(int index) {
    return *children[index];
  }

  int TreeNode::getLength() {
    return childLength;
  }

  String TreeNode::getName(){
    return nodeName.c_str();
  }

  void TreeNode::addChild(TreeNode &node) {
    children[childLength] = &node;
    childLength++;
  }

Я инициализирую его в функции настройки:

void setup() {
    Serial.begin(9600);

    TreeNode mainTree("main");
    TreeNode firstChild("first child");
    TreeNode secondChild("second child");
    TreeNode subChild("subschild");

    Serial.println(mainTree.getName()); //выводит "main"
    Serial.println(firstChild.getName()); //выводит "первый потомок";
    Serial.println(secondChild.getName()); //выводит второго потомка";

    mainTree.addChild(firstChild);
    mainTree.addChild(secondChild);
    Serial.println(mainTree.getName()); // печатает пустую строку
    Serial.println(secondChild.getName()); //выводит второй дочерний элемент"

    secondChild.addChild(subChild);
    Serial.println(secondChild.getName()); //выводит пустую строку
}

Итак, моя проблема в том, что когда я добавляю дочерний элемент к узлу, имя узла пустое или отображаются странные символы. Я думаю, что я неправильно понял передачу объекта по ссылке. Может кто-нибудь объяснить, что я сделал не так?

, 👍1


1 ответ


Лучший ответ:

1
TreeNode *children[];

Это объявляет массив указателей, однако также требует, чтобы вы назначили ему память. Я никогда не видел, чтобы вы выделяли эту память.

Если вы ожидаете небольшое количество потомков, то вы можете использовать эту верхнюю границу в качестве статического распределения:

#define MAX_CHILDREN 10

//...
TreeNode *children[MAX_CHILDREN];

В противном случае используйте вектор:

std::vector<TreeNode *> children;
,