mikrocontroller.net

Forum: PC-Programmierung struct in einem Object


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Martin M. (ats3788)
Datum:

Bewertung
0 lesenswert
nicht 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 ???

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du die Fehlermeldung mal LANGSAM und VOLLSTÄNDIG gelesen?

Denn die Lösung steht da eigentlich schon drin:
struct KeyboardClass::tButton KeyboardClass::foo()
{

}


Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Vancouver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: DPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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 KeyboardClass::tButton KeyboardClass::foo()
{

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

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin M. (ats3788)
Datum:

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

Autor: Martin M. (ats3788)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Martin M. (ats3788)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.