1

I'm having troubles understanding the inner workings of classes and such.

I have a class called Attributes that contains parameters. In my .ino, I can simply instantiate an object with Attributes greenBark(1, 2); and everything is hunkey dorey.

Problem: Now I need to create a Attributes object in my other class, called Tree. I figured out if my constructor doesn't have parameters, I can create an object within another class just fine. However, my attributes class constructor has parameters. When I try to create an parameterized object within another class, the compiler tosses an error. How can I create an attributes object within my tree class? I'm sorry if I got some of these terms mixed up, I'm trying to keep up!

Here are my current files (made for this example:)

The .ino file

#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); // constructor    
    void printAttributes(); // method

  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(); // constructor
    
    void makeTree(); // method

    // I want to create an attributes class object in my current class, so naturally I'd try to
    // create the object just like I did in my .ino sketch, but the below line doesn't work.
    
    //Attributes redBark(1, 2);

  private:  
};

The error provided is this:

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
5
  • @Juraj I read that page over a few times understanding what I could and I'm not seeing how it helps my situation Feb 24 at 19:15
  • 1
    I don't understand much of it either, so I tried Attributes redBark {1, 2}; and it did not throw an error ... I have no idea if it does what you are expecting ... Attributes redBark {1}; and Attributes redBark {1, 2, 3}; both throw an error, so it might be what you want
    – jsotola
    Feb 24 at 20:04
  • 1
    @AJ_Smoothie your post is not Arduino specific, and really is a general programming question ... it belongs at stackoverflow.com/questions
    – jsotola
    Feb 24 at 20:19
  • @jsotola I tried the braces in my actual code (the parameters are input pins and default pin states) and it worked out just great. Thank you Feb 27 at 15:39

1 Answer 1

0

I see two options here:

You might follow jsotola's comment and initialize redBark with braces:

Attributes redBark{1, 2};

For some reason, the syntax with parentheses is not allowed when initializing an object in a class declaration, but the syntax with braces is OK.

The other option is to initialize redBark in the Tree's constructor (and not in the class declaration) using an initializer list:

// In the class declaration:
Attributes redBark;

// The constructor:
Tree::Tree() : redBark(1, 2) {}
1
  • Using the curly braces worked out just fine! Thank you! Feb 27 at 15:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.