How to make an array of objects that contain object arrays

Hello, I am trying to create a program that has Ingredients, which contain a name and value, and also Drinks, which contain a name and an array of Ingredients. Here is the code to the classes;

class Ingredient {
public:
String ingName;
int ingVal;

Ingredient (String ingName_, int ingVal_){
ingName = ingName_;
ingVal = ingVal_;
}
};

class Drink {
public:
String drinkName;
Ingredient ingredients[];
byte MAX = 2;

Drink (String drinkName_, Ingredient ingredients_[]){
drinkName = drinkName_;
ingredients[MAX] = ingredients_[MAX];
}
};

I would like to create something along the lines of;

Drink drink_list[2] = {
Drink drink1("drink1", Ingredient ingdrink1[2] = {
("ingName1", 55),
("ingName2", 12)
};,
...
...
};

I have had success in creating an Ingredient array and then referencing that array in the Drink constructor, but have errors when trying to make an array of Drinks like so;

Ingredient dryMartini_[2] = {
Ingredient("gin", 75),
Ingredient("dry vermouth", 15)
};

Drink dryMartini("Dry Martini", dryMartini_);

Any help would be appreciated :slight_smile:

This compiles without warning or error:

class Ingredient
{
  public:
    String ingName;
    int ingVal;


    Ingredient (String ingName_, int ingVal_)
    {
      ingName = ingName_;
      ingVal = ingVal_;
    }
};


class Drink
{
  public:
    String drinkName;
    Ingredient ingredients[];
    const byte MAX = 2;


    Drink (String drinkName_, Ingredient ingredients_[])
    {
      drinkName = drinkName_;
      ingredients[MAX] = ingredients_[MAX];
    }
};




// I would like to create something along the lines of;


Ingredient ing1 = {"ingName1", 55};
Ingredient ing2 = {"ingName2", 12};
Ingredient ing3 = {"ingName3", 25};
Ingredient ing4 = {"ingName4", 107};


Ingredient ingA[2] =  {ing1, ing2};
Ingredient ingB[2] =  {ing3, ing4};


Drink drink_list[2] =
{
  {"drink1", ingA} ,
  {"drink2", ingB}
};


void setup() {}
void loop() {}

Here is the entirety of my code, I have updated it slightly from before;

class Ingredient {
  public:
    String ingName;
    int ingVal;

  Ingredient (String ingName_, int ingVal_){
    ingName = ingName_;
    ingVal = ingVal_;
  }
};

class Drink {
  public:
    String drinkName;
    Ingredient *ingredients;
    byte s;
    
  Drink (String drinkName_, Ingredient ingredients_[], byte s_){
    drinkName = drinkName_;
    ingredients = ingredients_;
    s = s_;
  }
};

Ingredient ing1_[] = {
   Ingredient("name1", 75),
   Ingredient("name2", 15)
};

Ingredient ing2_[] = {
  Ingredient("name3", 45),
  Ingredient("name4", 55)
};

Drink drink1("Drink1", ing1_, sizeof(ing1_)/sizeof(ing1_[0]));
Drink drink2("Drink2", ing2_, sizeof(ing2_)/sizeof(ing2_[0]));

Drink drink1("Drink1", ing1_, sizeof(ing1_)/sizeof(ing1_[0]));
Drink drink2("Drink2", ing2_, sizeof(ing2_)/sizeof(ing2_[0]));

Drink drink_list[2] = {drink1, drink2};
void setup() {
  Serial.begin(9600);
  for (int a = 0; a < sizeof(drink_list); a++){
    Serial.println(drink_list[a].drinkName);
  }
}

When I run this, the serial port spits out nonsense like this;

Drink2
Drink1
name3
Ϳ⸮⸮7⸮⸮d+⸮⸮ۦب⸮ˬ⸮'⸮⸮}^⸮⸮⸮⸮⸮⸮⸮⸮?)})⸮⸮W⸮O⸮??m⸮j⸮n⸮⸮⸮⸮⸮⸮⸮⸮⸮>⸮⸮⸮⸮
⸮O⸮⸮⸮~⸮⸮/⸮⸮⸮[⸮&⸮⸮⸮⸮⸮ҿ|⸮⸮}⸮⸮zw&⸮;⸮⸮⸮⸮⸮⸮㻿⸮⸮⸮?⸮⸮⸮K⸮⸮ܾ⸮]⸮⸮⸮⸮]⸮⸮|d=6w⸮s⸮y⸮{⸮x⸮=wk⸮_⸮⸮⸮⸮⸮]GtϟG⸮Y⸮euO4⸮⸮⸮W⸮O⸮N⸮⸮ڹ⸮⸮⸮&S⸮⸮{?⸮⸮⸮⸮⸮}⸮⸮⸮⸮1⸮⸮|⸮~⸮⸮e⸮⸮ze⸮⸮Q⸮⸮^⸮⸮⸮⸮⸮⸮⸮8⸮s⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮U⸮_⸮⸮⸮⸮⸮z?⸮⸮{eN⸮ǻ⸮⸮⸮⸮⸮mݮT⸮7⸮⸮⸮⸮e߯⸮Ĵ⸮⸮⸮⸮⸮W>{⸮+⸮⸮⸮⸮7~⸮ڳ⸮⸮⸮Vð⸮⸮⸮⸮⸮⸮w⸮⸮⸮⸮|⸮co⸮⸮Z⸮⸮⸮⸮⸮⸮⸮n?⸮⸮U⸮⸮⸮⸮~⸮⸮⸮ǻ⸮/⸮⸮e⸮⸮⸮⸮⸮3⸮=⸮⸮⸮⸮c⸮⸮⸮⸮⸮⸮w⸮⸮ֽ⸮w⸮E⸮⸮O⸮⸮⸮⸮⸮o[⸮⸮⸮_⸮⸮II⸮⸮⸮<⸮⸮⸮⸮⸮⸮⸮~+⸮⸮⸮⸮⸮⸮⸮⸮⸮σ⸮f{~⸮;⸮{⸮⸮⸮⸮x_⸮}mٟ⸮⸮V⸮ut⸮w⸮⸮}⸮⸮w⸮E⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮i⸮5⸮O⸮⸮g⸮⸮^⸮⸮⸮k⸮{⸮⸮e9⸮⸮⸮⸮[e⸮⸮ue{z⸮n⸮⸮⸮⸮v㮮⸮⸮⸮⸮⸮⸮⸮y\⸮⸮⸮6⸮⸮⸮g⸮⸮={⸮@⸮⸮⸮5?⸮[⸮⸮⸮⸮⸮i9⸮⸮⸮⸮ie⸮o⸮]⸮^_߯⸮o⸮V⸮⸮⸮wO⸮⸮~⸮oW⸮{z⸮⸮ҍ⸮⸮߿]⸮?⸮>⸮⸮_⸮⸮⸮O⸮⸮⸮⸮⸮:⸮{⸮⸮⸮a⸮⸮⸮=⸮⸮s⸮/⸮⸮⸮⸮⸮Q⸮u⸮⸮⸮2⸮⸮⸮o⸮⸮s⸮⸮⸮⸮⸮S⸮t⸮M⸮⸮|⸮⸮#⸮⸮⸮w=W⸮⸮⸮⸮⸮⸮}⸮⸮⸮⸮e⸮4n⸮e⸮S⸮⸮⸮⸮⸮⸮멿⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮=⸮}⸮mg⸮⸮ց-⸮⸮⸮\s⸮|⸮⸮⸮_⸮~~⸮⸮⸮⸮⸮⸮⸮6o⸮⸮⸮⸮⸮⸮^⸮⸮׼⸮⸮⸮⸮;K5⸮⸮羵{ׯ⸮⸮⸮⸮⸮⸮
O⸮⸮⸮⸮=⸮⸮⸮O⸮Vv⸮⸮⸮⸮⸮⸮O⸮⸮⸮⸮⸮⸮⸮⸮;⸮E⸮⸮⸮⸮O⸮K⸮⸮⸮u⸮⸮ޟ⸮m⸮]⸮^⸮⸮o⸮⸮⸮?o⸮w⸮⸮⸮⸮⸮⸮u\sU⸮⸮⸮⸮⸮g⸮⸮⸮⸮{⸮?⸮|w⸮⸮⸮~⸮⸮⸮c⸮⸮⸮⸮4⸮⸮⸮⸮߷⸮⸮⸮M_{ς⸮{⸮⸮_⸮⸮}⸮

Why isn't it printing a value?

It is printing values. It prints "Drink1" and "Drink2" (strangely in reverse order) and then goes on to print a bunch more elements that were not initialized because:   for (int a = 0; a < sizeof(drink_list); a++){
You are using the number of bytes in 'drink_list' where you meant to use the number of elements in 'drink_list'.

Try this:

void setup()
{
  Serial.begin(9600);
  for (byte a = 0; a < (sizeof drink_list / sizeof drink_list[0]); a++)
  {
    Serial.println(drink_list[a].drinkName);
    for (byte j = 0; j < drink_list[a].s; j++)
    {
      Serial.print("\t");
      Serial.print(drink_list[a].ingredients[j].ingName);
      Serial.print("\t");
      Serial.print(drink_list[a].ingredients[j].ingVal);
    }
  }
}


void loop() {}

Thank you! It is working perfectly