Klasse als private: Feld in einer anderen Klasee

Hallo an alle da draußen,
ich habe mal eine Frage an euch.

Ich bin gerade dabei zwei Klassen aufzusetzen die ich später als Library importieren möchte.
Ich möchte selber zwei Library’ s erstellen, und zwar für den MCP3004 und für den MCP23017.

Ich kann aber nicht die eine Klasse in die andere stecken.
Doch kann ich schon, aber nicht so wie ich es mir denke.

Der Plan sieht folgendermaßen aus:

  1. In der Klasse MCP3004 will ich ein Feld des MCP23017 unterbringen.
  2. Im Konstrucktor des MCP3004 soll dann der Konstrucktor des MCP23017 aufgerufen werden.

Folgende Fehlermeldung erhalte ich dann:

MCP3004_MCP3008.cpp: In constructor ‘MCP3004_for_MCP23017::MCP3004_for_MCP23017(int, int, int, int)’:
MCP3004_MCP3008.cpp:15: error: no matching function for call to ‘MCP23017::MCP23017()’
MCP23017.h:11: note: candidates are: MCP23017::MCP23017(int, int, int, int)
MCP23017.h:5: note:                 MCP23017::MCP23017(const MCP23017&)
MCP3004_MCP3008.cpp:16: error: ‘expander’ is not a class or namespace

Hier die Klasse MCP3004:

#ifndef MCP3004_MCP3008_h
#define MCP3004_MCP3008_h
#include "Arduino.h"
#include "MCP23017.h"

class MCP3004_for_MCP23017 {
  private:
    int _taktpin, _mosipin, _misopin, _cspin;
    MCP23017 expander;    // = MCP23017(0, 1, 12, 13);
  
  public:
    MCP3004_for_MCP23017(int taktpin, int mosipin, int misopin, int cspin);
    int readADC(int adcpin);
  
};

#endif

und

#include "Arduino.h"
#include "MCP3004_MCP3008.h"

MCP3004_for_MCP23017::MCP3004_for_MCP23017(int taktpin, int mosipin, int misopin, int cspin) {
  expander::MCP23017(0, 1, 12, 13);
}

int MCP3004_for_MCP23017::readADC(int adcpin) {
}

Und hier die Klasse MCP23017:

#ifndef MCP23017_h
#define MCP23017_h
#include "Arduino.h"

class MCP23017 {
  private:
    int _iodira, _iodirb, _gpioa, _gpiob;
    
  
  public:
    MCP23017(int iodira, int iodirb, int gpioa, int gpiob);
    void writeGPIOA(int value);
    int readGPIOA();
    void writeGPIOB(int value);
    int readGPIOB();
};

#endif

Ich habe jetz nur leider keine Ahnung was ich falsch mache, eigendlich sollte es nach diesen Schema funktionieren.

Für Hilfe aller Art bin ich dankbar.

Stefan

Heiny:
eigendlich sollte es nach diesen Schema funktionieren.

Aber nur mit korrekter Syntax. Schau dir mal sogenannte “initializer lists” an. In C++ verwendet man diese Listen, weil zu dem Zeitpunkt wo der eigentliche Konstruktor ausgeführt wird, das Objekt schon erzeugt wurde!

Hier mal prinzipiell in Standard C++ auf dem PC:

Klasse B Header (das ist die Klasse die in der anderen enthalten ist):

#ifndef B_H
#define B_H

class B
{
public:
  B(int value);

  int value;
};

#endif B_H

Klasse B Implementierung:

#include "B.h"

B::B(int pValue) : value(pValue)    //initialisiert value mit dem Wert von pValue
{
}

Klasse A Header:

#ifndef A_H
#define A_H

#include "B.h"

class A
{
public:
   A(int value);

  int getValue();
private:
  B object;
};

#endif A_H

Klasse A Implementierung:

#include "A.h"


A::A(int value) : object(value)    //<--- Hier ist dein eigentliches Problem. Ruft den Konstruktor von object mit value auf
{
}

int A::getValue()
{
    return object.value;
}

Also in der Initialisierungs-Liste einfach den Konstruktor über den Objekt-Namen aufrufen

Test Code:

#include "A.h"
#include "B.h"

int _tmain(int argc, _TCHAR* argv[])
{
  A objectA(5);
  cout << objectA.getValue() << endl;
 
  getchar();
}

Ausgabe: 5

Aber der Wert der ausgelesen wird steckt eben in einem Objekt von B

Eine andere Option ist folgendes:
Du erstellst die zwei Objekte getrennt und übergibst dem einen Objekt im Konstruktor einen Zeiger auf das andere

OK, danke. Das hat mir sehr weitergeholfen. Jetzt kann ich meine Library's implementieren. :)

Danke.