Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

1

13.07.2016, 18:41

C++ Attribute der abgeleiteten Klasse verwenden

Hi,
die Attribute der abgeleiteten Klasse sollten sich so verwenden lassen, oder übersehe ich da etwas?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class UiControl
{
private:
    UiControl()
    {
        //The constructor UiControl is private, only objects of subclasses can be created
    }

public:
    int x;
    int y;
    
    int width;
    int height;

    enum TypeTag { BUTTON, TEXT_FIELD };
    TypeTag typeTag;
};

class Button : public UiControl
{
public:
    this->typeTag; //Fehler: this->typeTag existiert nicht
};

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

2

13.07.2016, 19:10

Du brauchst ein "UiControl::typeTag" um auf die Basisklasse zugreifen zu können, wenn ich mich nicht irre.

Besser wäre es aber eine getter-Funktion in der Basisklasse (protected) zu bauen, finde ich sauberer.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

13.07.2016, 19:19

Geht doch...
http://ideone.com/GCPcNu
Allerdings nicht privatem Konstruktor.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

4

13.07.2016, 19:36

Ideone verwendet einen anderen Compiler. Der von Visual Studio 2015 kann auch mit einem protected Konstruktor den Code nicht kompilieren.

Das mit der Bassisklasse und :: erzeugt einen Fehler.

C-/C++-Quelltext

1
2
3
4
5
class Button : public UiControl
{
public:
    UiControl::typeTag = BUTTON; //error: this declaration has no storage class or type specifier.
};

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

13.07.2016, 20:19

Das is ja auch Quatsch, das muss in der Basis-Klasse mit einem Wert initialisiert werden, nicht in der derived.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

13.07.2016, 20:20

C-/C++-Quelltext

1
2
3
4
5
class Button : public UiControl
{
public:
    this->typeTag; //Fehler: this->typeTag existiert nicht
};

C-/C++-Quelltext

1
2
3
4
5
class Button : public UiControl
{
public:
    UiControl::typeTag = BUTTON; //error: this declaration has no storage class or type specifier.
};


Was genau soll das bitte sein? this einfach irgendwo mitten in der Klassendefinition!? Member ohne Name!? You drunk? ^^

7

14.07.2016, 11:46

Nutze den Konstruktor der Basisklasse um ihm den Typen mitzugeben.
Über den Konstruktor der Kindklasse (die weiß ja was für ein Typ sie ist) reichst du den Typ an die Basisklasse weiter via Initialisierungsliste.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Koschi« (14.07.2016, 11:51)


MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

8

14.07.2016, 16:26

Hatte irgendwie versucht einen Attribut Wert zu setzen und war mit "wieso ist das in c++ so umständlich"-Gedanken beschäftigt, dass ich vergessen habe, dass ein Konstruktor die Lösung dafür ist. Wenn ich mir meine Beiträge im nachhinein noch mal durchlese, *im_Boden_versinke*

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class UiControl
{
protected:
    UiControl()
    {
        //The constructor UiControl is protected, only objects of subclasses can be created
    }

public:
    int x;
    int y;
    
    int width;
    int height;

    enum TypeTag { BUTTON, TEXT_FIELD };
    TypeTag typeTag;
};

class Button : public UiControl
{
public:
    string caption;

    Button()
    {
        this->typeTag = BUTTON;
    }
};

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

14.07.2016, 16:44

Hatte irgendwie versucht einen Attribut Wert zu setzen und war mit "wieso ist das in c++ so umständlich"-Gedanken beschäftigt, dass ich vergessen habe, dass ein Konstruktor die Lösung dafür ist.

Mir fällt ehrlich gesagt auf die Schnelle grad keine Sprache ein in der das weniger "umständlich" ginge... ;)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

14.07.2016, 16:54

Mir fällt ehrlich gesagt auf die Schnelle grad keine Sprache ein in der das weniger "umständlich" ginge...

Naja in "mir ist alles egal"-Sprachen wie Python muss man sich etwas weniger Gedanken machen. Public, private und protected gibts ja zum Beispiel schon mal gar nicht. Ob Sprachen wie Python da jetzt einfacher oder schwerer sind, darüber lässt sich streiten. Durch so Dinge wie neue Attribute zur Laufzeit hinzufügen kann ich meinen Code natürlich irgendwo abkürzen, übersichtlicher wird es dadurch aber nicht unbedingt.
Das soll kein Anstoß zu einer Diskussion über Python werden. Wollte nur darauf hinweisen dass es da schon noch andere Konzepte gibt die der ein oder andere sicherlich als einfacher betrachten würde.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige