Forum: PC-Programmierung struct in einem Object


von Martin M. (ats3788)


Lesenswert?

Hallo
wie macht man das in C++
Ich habe eine Klasse

class KeyboardClass
{
 protected:
   struct tButton {
     uint16_t x;
     uint16_t y;
     uint16_t h;
     uint16_t w;
     uint16_t KeyCol;
     uint16_t Shadow;
     uint16_t SColor;
     uint16_t TColor;
   };

struct tButton foo();
}

..............
struct tButton KeyboardClass::foo()
{

Der Compiler meckert mit

Keyboard.cpp: 32:16: error: prototype for 'tButton KeyboardClass::foo()' 
does not match any in class 'KeyboardClass
 struct tButton KeyboardClass*: foo()
Error compiling project sources

Keyboard.cpp:5: In file included from

Keyboard.h: 108:18: error: candidate is: KeyboardClass::tButton 
KeyboardClass::foo()
   struct tButton foo()
Build failed for project '_Keyboard'

Was ist falsch an dem Prototype ???

von Jim M. (turboj)


Lesenswert?

Hast Du die Fehlermeldung mal LANGSAM und VOLLSTÄNDIG gelesen?

Denn die Lösung steht da eigentlich schon drin:
1
struct KeyboardClass::tButton KeyboardClass::foo()
2
{
3
4
}

von Oliver S. (oliverso)


Lesenswert?

Jetzt liefern aktuelle Compiler doch schon so schöne Fehlermeldungen.
Lies die nochmal:

>Keyboard.h: 108:18: error: candidate is: KeyboardClass::tButton
>KeyboardClass::foo()

Oliver
Nachtrag: Jim war schneller...

: Bearbeitet durch User
von Vancouver (Gast)


Lesenswert?

Musst du vielleicht für den return type von foo auch KeyboardClass:: 
angeben, wie vom Complier vorgeschlagen? Der Typ wurde ja innerhalb der 
Klasse definiert.
Soweit ich weiß, kannst du bei C++ das Schlüsselwort "struct" bei der 
Verwendnung des Structs auch weglassen.

von DPA (Gast)


Lesenswert?

Na Ausserhalb der Klasse/des Namespace von KeyboardClass, musst du für 
alles, was sich auf innerhalb des KeyboardClass namespace bezieht, 
explizit angeben, dass es dort drin ist. Das sagt dir ja sogar schon der 
Compiler in der Fehlermeldung. tButton ist im Namespace KeyboardClass, 
also musst du ausserhalb von KeyboardClass für das tButton  darin 
KeyboardClass::tButton schreiben. Also:
1
class KeyboardClass
2
{
3
 protected:
4
   struct tButton {
5
     uint16_t x;
6
     uint16_t y;
7
     uint16_t h;
8
     uint16_t w;
9
     uint16_t KeyCol;
10
     uint16_t Shadow;
11
     uint16_t SColor;
12
     uint16_t TColor;
13
   };
14
15
struct tButton foo();
16
}
17
18
..............
19
struct KeyboardClass::tButton KeyboardClass::foo()
20
{

Und weil das hier C++ ist, könnte man das struct bei der Verwendung von 
tButton glaub ich sogar weglassen.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Vancouver schrieb:
> Soweit ich weiß, kannst du bei C++ das Schlüsselwort "struct" bei der
> Verwendnung des Structs auch weglassen.

DPA schrieb:
> Und weil das hier C++ ist, könnte man das struct bei der Verwendung von
> tButton glaub ich sogar weglassen.

Ja, das kann man in C++ immer weglassen, es sei denn es gibt eine 
gleichnamige Funktion.
Außerdem gibt es in C++ keine structs, sondern nur Klassen - mit dem 
"struct" Schlüsselwort definiert man eine Klasse, in der alles per 
default public ist (und nicht private wie bei per "class" definierten 
Klassen). struct und class zu mischen ist daher nicht unbedingt 
sinnvoll.

Siehe https://stackoverflow.com/a/34108140/4730685

von Oliver S. (oliverso)


Lesenswert?

Niklas G. schrieb:
> struct und class zu mischen ist daher nicht unbedingt
> sinnvoll.

Ist, wie bei allen Diskussionen dieser Art, reine Ansichtsache

https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-org

C.2: Use class if the class has an invariant; use struct if the data 
members can vary independently

Oliver

von Martin M. (ats3788)


Lesenswert?

Vielen Dank ihr C++ Freunde ich komme aus der Pascal Welt und lerne 
selbst als alter Sack immer was dazu !!!

von Martin M. (ats3788)


Lesenswert?

Nochmal Danke
Ich habe das nun so definiert, compiliert nun ohne Probleme ist das
OK so ?????

struct tButton {
  uint16_t x;
  uint16_t y;
  uint16_t h;
  uint16_t w;
  uint16_t KeyCol;
  uint16_t Shadow;
  uint16_t SColor;
  uint16_t TColor;

};


class KeyboardClass
{
 protected:
tButton _Button;

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Martin M. schrieb:
> tButton _Button;

Namen die mit Unterstrich+Großbuchstabe, oder 2 Unterstrichen anfangen 
sind in C und C++ der Standard-Bibliothek vorenthalten. Ansonsten ist es 
korrekt.

Die inkonsistente Benennung der Variablen ist etwas komisch.

von guest (Gast)


Lesenswert?

Niklas G. schrieb:
> Namen die mit Unterstrich+Großbuchstabe, oder 2 Unterstrichen anfangen
> sind in C und C++ der Standard-Bibliothek vorenthalten. Ansonsten ist es
> korrekt.

Einer der Freud'schen Sorte, gemeint war wohl "vorbehalten".

von Martin M. (ats3788)


Lesenswert?

Niklas G. da hast Du recht das ändere ich noch
aber Danke ihr habt mir sehr geholfen

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.