initialisierte Klassen übergeben

Moin,

in einem eigenen Header deklariere ich zwei Klassen:

ESPBasic.h

#pragma once
//ESP8266_Basic
  #include "FFS.h"
  #include "I2C.h"
  
class ESP8266_Basic{

public:  
  void start();  

  ESP8266_Basic();
  FFS ffs;
  I2C i2c;
  
private:
};

wie kann ich es erreichen, dass ich in der Klasse FFS funktionen der Klasse I2C nutzen kann.
Gibt es eine Möglichkeit der Klasse ffs bei der initialisierung einen Zeiger auf die Klasse i2c mitzugeben
und wie würde dann die Verwendung innerhalb von ffs aussehen?

Gruß
Pf@nne

Auch hier wieder: Initialisierungsliste! Schau dir das an.

Und dann verwende eine Referenz. Das ist ähnlich wie Zeiger. Aber Zeiger braucht man hier nicht.

class Test1
{
public:
  void print()
  {
    Serial.println("Test");
  }
};

class Test2
{
public:
  Test2(Test1& test1) : test1(test1)    //Referenz zuweisen
  {
    test1.print();      //Testausgabe
  }
private:
  Test1& test1;     //Referenz auf ein Objekt von Test1
};


class TestMain
{
public:
  TestMain() : test2(test1)   //übergibt test1 an test2
  {
  }

  Test1 test1;
  Test2 test2;
};



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

  TestMain test;
}

void loop()
{
}

habs, vielen Dank!

ESP8266_Basic_TEST.ino

#include "ESP8266_Basic.h"
ESP8266_Basic espClient;

int count = 1;

void setup() {  
  Serial.begin(115200); 
  Serial.println("");
   
  espClient.start();
}  

void loop() {
  espClient.i2c.lcd.display.clear();
  espClient.ffs.i2c.lcd.display.clear();
  espClient.ffs.i2c.lcd.println("Hello World!", 2);
}

ESP8266_Basic.h

#pragma once
//ESP8266_Basic
  #include "FFS.h"
  #include "I2C.h"
  
class ESP8266_Basic{

public:  
  void start();  

  ESP8266_Basic();
  FFS ffs;
  I2C i2c;
  
private:
};

ESP8266_Basic.cpp

#include "ESP8266_Basic.h"

ESP8266_Basic::ESP8266_Basic():
    ffs(i2c){  
}

void ESP8266_Basic::start(){
  i2c.start();
}

FSS.h

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

//===============================================================================
//  Class FFS
//===============================================================================
class FFS{
public:  
  FFS(I2C& lcd);
  I2C& i2c;
private:   
};

FSS.cpp

#include "FFS.h"

//===============================================================================
//  FFSjsonFile 
//===============================================================================
FFS::FFS(I2C& i2c):
  i2c(i2c){
}

I2C.h

#pragma once
  #include <Arduino.h>
  #include <SSD1306.h>

//===============================================================================
//  LCD Display 
//===============================================================================
class LCD{
public:
  LCD();
  void init();
  void println(String txt, int line);
  
  SSD1306 display;
private:  
}; 
 
//===============================================================================
//  I2C 
//===============================================================================
class I2C{
public:
  I2C();
  LCD lcd;
  void start();
  
private:

};

I2C.cpp

#include "I2C.h"

//===============================================================================
//  I2C 
//===============================================================================
I2C::I2C(){
}

void I2C::start(){
  lcd.init();
}

//===============================================================================
//  LCD Display 
//===============================================================================
LCD::LCD():
    display(0x3c, 4, 5){
}

void LCD::init(){
  display.init();
  display.flipScreenVertically();
  display.setContrast(255);
}

void LCD::println(String txt, int line){
  line = line * 16;
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_16);
  display.drawString(0, line, txt);
  display.display();  
}

Ist das hier der Grund warum i2c in fss privat bleiben sollte?
Damit nicht der volle Zugriff auf i2c über mehrere instanzen möglich ist?

void loop() {
  espClient.i2c.lcd.display.clear();
  espClient.ffs.i2c.lcd.display.clear();
  espClient.ffs.i2c.lcd.println("Hello World!", 2);
}

Grundregel Nummer 1:
Die Sichtbarkeit möglichst weit einschränken.
Nur das was Public sein muss, auch Public machen.

Eigenschaften, also Member Attribute, oder Klassen Variablen, oder Instanz Variablen (egal, wie man es nennt) nicht publizieren. Nur über Public Getter und Setter zugreifbar machen.

Protected und Friends möglichst sparsam verwenden.

Klare Schnittstellen schaffen, den Rest kapseln.