Невозможно создать параметризованный объект внутри другого класса

У меня проблемы с пониманием внутренней работы классов и т.п.

У меня есть класс Attributes, содержащий параметры. В моем .ino я могу просто создать экземпляр объекта с Attributes greenBark(1, 2);, и все будет в порядке.

Проблема. Теперь мне нужно создать объект Attributes в другом моем классе под названием Tree. Я понял, что если у моего конструктора нет параметров, я могу просто создать объект в другом классе. Однако мой конструктор класса атрибутов имеет параметры. Когда я пытаюсь создать параметризованный объект в другом классе, компилятор выдает ошибку. Как я могу создать объект атрибутов в моем древовидном классе? Извините, если я перепутал некоторые из этих терминов, я стараюсь не отставать!

Вот мои текущие файлы (сделанные для этого примера:)

Файл .ino

#include "attributes.h"
#include "tree.h"

Attributes greenBark(1, 2);

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

void loop()

{
  greenBark.printAttributes();
}

attributes.cpp

#include "attributes.h"

Attributes::Attributes(int size, int texture)

{
  _size = size;
  _texture = texture;  
}

void Attributes::printAttributes()
{
  Serial.print("GreenBark Attributes: ");
  Serial.print("Size = ");
  Serial.print(_size);
  Serial.print(" Texure = ");
  Serial.print(_texture);
  Serial.println();
}

attributes.h

#pragma once
#include <Arduino.h>

class Attributes
{
  public:
    Attributes(int size, int texture); // конструктор
    void printAttributes(); // метод

  private:
    int _size = 0;
    int _texture = 0;
};

tree.cpp

#include "attributes.h"
#include "tree.h"

Tree::Tree()
{

}

tree.h

#pragma once
#include <Arduino.h>
#include "attributes.h"

class Tree
{
  public:
    
    Tree(); // конструктор
    
    void makeTree(); // метод

    // Я хочу создать объект класса атрибутов в моем текущем классе, поэтому, естественно, я попытаюсь
    // создайте объект так же, как я сделал это в своем скетче .ino, но строка ниже не работает.
    
    //Атрибуты redBark(1, 2);

  private:  
};

Предоставлена следующая ошибка:

In file included from C:\Users\ajrob\Dropbox\Projects\Electronics\Arduino Sketchbook\ParameterizedConstructor\ParameterizedConstructor.ino:2:0:
C:\Users\ajrob\Dropbox\Projects\Electronics\Arduino Sketchbook\ParameterizedConstructor\tree.h:16:24: error: expected identifier before numeric constant
     Attributes redBark(1, 2);
                        ^
C:\Users\ajrob\Dropbox\Projects\Electronics\Arduino Sketchbook\ParameterizedConstructor\tree.h:16:24: error: expected ',' or '...' before numeric constant
In file included from C:\Users\ajrob\Dropbox\Projects\Electronics\Arduino Sketchbook\ParameterizedConstructor\tree.cpp:2:0:
C:\Users\ajrob\Dropbox\Projects\Electronics\Arduino Sketchbook\ParameterizedConstructor\tree.h:16:24: error: expected identifier before numeric constant
     Attributes redBark(1, 2);
                        ^
C:\Users\ajrob\Dropbox\Projects\Electronics\Arduino Sketchbook\ParameterizedConstructor\tree.h:16:24: error: expected ',' or '...' before numeric constant

exit status 1

Compilation error: expected identifier before numeric constant

, 👍1

Обсуждение

https://en.cppreference.com/w/cpp/language/constructor, @Juraj

@Juraj Я перечитал эту страницу несколько раз, понимая, что могу, и не вижу, как это помогает в моей ситуации., @HavocRC

Я тоже мало что в этом понимаю, поэтому я попробовал Attributes redBark {1, 2};, и он не выдал ошибки... Я понятия не имею, делает ли он то, что вы ожидаете... Attributes redBark {1}; и Атрибуты redBark {1, 2, 3}; оба вызывают ошибку, так что это может быть то, что вам нужно, @jsotola

@AJ_Smoothie ваш пост не относится к Arduino, а на самом деле является общим вопросом программирования ... он принадлежит https://stackoverflow.com/questions, @jsotola

@jsotola Я попробовал фигурные скобки в своем реальном коде (параметрами являются входные контакты и состояния контактов по умолчанию), и это сработало просто отлично. Спасибо, @HavocRC


1 ответ


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

0

Я вижу здесь два варианта:

Вы можете последовать комментарию jsotola и инициализировать redBark фигурными скобками:

Attributes redBark{1, 2};

По какой-то причине синтаксис со скобками не допускается, когда инициализация объекта в объявлении класса, но синтаксис с фигурные скобки в порядке.

Другой вариант — инициализировать redBark в конструкторе Tree. (а не в объявлении класса) с использованием списка инициализаторов:

// В объявлении класса:
Attributes redBark;

// Конструктор:
Tree::Tree() : redBark(1, 2) {}
,

Использование фигурных скобок сработало просто отлично! Спасибо!, @HavocRC