Forum: Compiler & IDEs Arduino Object Member Problem


von Achim A. (Firma: augilabs) (womisa)


Lesenswert?

Hallo

es passt eventuell nicht ganz zum GCC Forum, aber ich hoffe trotzdem auf 
Hilfe.

Ich habe eine externe Library (Class zB. EXX) von der möchte ich ein 
private Membervariablein meiner eigenen Klasse anlegen. EXX hat einen 
Constructor EXX::EXX(int pin)

Also in etwa so:

h_File:

....

class MEINE{

...
  double MaxTemp;
  double MinTemp;

static EXX test(10);  <==== ERROR  error: expected ',' or '...' before 
numeric constant
....

}

Falls ich das in meinen cpp File einfüge ist das ok, aber da ist das 
doch keine Membervariable von MEINE
......

.....
static EXX test(10); <===hier ok
...
MEINE:MEINE{

}
....



Kann mir da jemand helfen und sagen, was ich falsch mache?

MfG
Achim

von Oliver (Gast)


Lesenswert?

Du hast ein C++ Buch?

class EXX {...};

class MEINE{

...
  double MaxTemp;
  double MinTemp;

  EXX test;

  MEINE() : EXX(10)

}

Oliver

von Oliver (Gast)


Lesenswert?

Oliver schrieb:
> MEINE() : EXX(10)

Da fehlt jetzt noch der Funktionsrumpf. Also mindestens so:

MEINE() : EXX(10)
{}

Oliver

von Achim A. (Firma: augilabs) (womisa)


Lesenswert?

Hallo

ist das nicht was anderes, was ich anstrebe. EXX ist eine fremde Klasse 
und kann in einem Scetch problemlos angelegt werden. Es ist aus meiner 
Sicht ein neuer Datentyp also wie float, int etc. nur eben EXX.

...EXX test(10) ; im Scetch problemlos anlegbar

Ich möchte das aber meiner Klasse anlegen....


Ich möchte meine Klasse nicht von EXX ableiten (MEINE() : EXX(10)) und 
schon gar nicht einen neuen Konstruktor definieren.

Ich möchte das wie ne float oder int als private Membervariable anlegen 
und nutzen. Thema ist doch da Class Objects oder?
Also laut Buch:

....
EXX test;
.....

Achim

von Karl H. (kbuchegg)


Lesenswert?

Achim A. schrieb:
> Hallo
>
> ist das nicht was anderes, was ich anstrebe.

Inwiefern

> EXX ist eine fremde Klasse
> und kann in einem Scetch problemlos angelegt werden.

Wie ich diesen Begriff hasse.
Du programmierst C++ und nicht irgendwelche Scetche.
Also gelten für dich die Sprachregeln von C++.

> Es ist aus meiner
> Sicht ein neuer Datentyp also wie float, int etc. nur eben EXX.

Ja, passt ja auch

>
> ...EXX test(10) ; im Scetch problemlos anlegbar

Ja, weil das eine Variable, ein Objekt für sich selbst ist. Und dem kann 
man bei der Objekterzeugung einen Initalwert mitgeben.

genauso, wie du in einer FUnktion
1
void foo()
2
{
3
  int i(5);
4
}

einen int anlegst, der bei der Erzeugung intialisiert wird, genauso 
kannst du auch irgendein anderes Objekt anlegen
1
void foo()
2
{
3
  EXX obj(5);
4
}

und es bei der Erzeugung mit einem Wert initialisieren.

>
> Ich möchte das aber meiner Klasse anlegen....
>

Ja, dann mach das.

> Ich möchte meine Klasse nicht von EXX ableiten (MEINE() : EXX(10))

tust du ja auch nicht. Du solltest dein C++ Buch nicht nur anlassbezogen 
zu Rate ziehen, sondern es mal von vorne bis hinten durcharbeiten, damit 
du zumindest die Syntax erkennst, wenn du sie vorgebetet bekommst.

> und
> schon gar nicht einen neuen Konstruktor definieren.

doch. Das wirst du aber müssen.
Denn genau das ist der in C++ vorgesehene Mechanismus, mit dem ein 
Objekt seine Member initialisiert.


> Ich möchte das wie ne float oder int als private Membervariable anlegen
> und nutzen.

Und?
Wie initialisiert man denn eine Membervariable eines Objektes?

schreibst du
1
class meine
2
{
3
  int i_( 5 );
4
};

oder schreibst du
1
class meine
2
{
3
  meine() : i_( 5 ) {}
4
5
  int i_;
6
};

und mit anderen Datentypen ist das auch nicht anders.

Noch ein Hinweis:
Eine Klassendeklaration definiert ja noch kein Objekt. Eine 
Klassendeklaration ist ja nur ein Bauplan, wie ein Objekt aussehen soll. 
Objekte werden zb in Funktionen erzeugt
1
void foo()
2
{
3
  meine jkl;
4
}
und erst da erwacht dann der Mechanismus zum Leben.

Aber mit
1
class meine
2
{
3
  ...
4
5
  EXX mem;
6
};

beschreibst du ja nur, wie so ein 'meine' Objekt prinzipiell aussieht. 
Aber du hast deswegen ja noch kein derartiges Objekt. Erzeugt wird ein 
derartiges Objekt erst hier
1
void foo()
2
{
3
  meine jkl;
4
}
und 'Objekt erzeugen' bedeutet, dass ein Konstruktor abläuft. Daher ist 
der Konstruktor der Code-Platz an der dieses Objekt dann seinerseits 
seine Member initialisiert.

von Achim A. (Firma: augilabs) (womisa)


Lesenswert?

Hallo

ok! Danke für die "Lehrstunde". Ich erahne mein Problem.

Danke
Achim

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.