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

1

24.10.2015, 03:41

virtuel vererbt error: request for member 'los' is ambiguous

Hallo wie kann ich 2 Klassen mit einander verschmelzen und auf einer Funktion der vererbenden Klasse zu greifen?

Quellcode

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Base // darf nur einmal vererbt werden! Weil auf anderer Stelle auf Base::index zugegriffen wird
{
public:
    Base()
    {
    index++;
    }
    int Aktion(int a)
    {

    }


    void los()
    {
        //..
    }
};
int Base::index=0;



class Option ///: public virtual Base
{
public:
    Option()
        {
        Aktion(11);
        }
};



class Super : public Base, public Option
{
public:
    Super()
    {
    los();

    }

};



Super super;




p, li { white-space: pre-wrap; } error: reference to 'los' is ambiguous




Anwendungs Beispiel:
Eine Klasse Stapel mit dem Attribut vector<std::wchar> m_stapel kann von meheren Auftragsklassen vererbt werden. z.B. Klasse Schlafen, Essen, etc..., diese Klassen fuehren dann den Befehl m_stapel.push_back(L"Schlafen....");

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

24.10.2015, 03:53

Ich verstehe deinen Anwendungsfall nicht.

Höchstwahrscheinlich ist das, was du tun willst, von der Idee her falsch.

Mit Vererbung stellt man "ist ein"-Relationen dar. Wenn du also z. B. eine Klasse "Schlafen" von einer Klasse "Stapel" erben lässt, dann bedeutet das "Schlafen ist ein Stapel". Es sollte klar sein, dass das Unfug ist.

Ein sinnvolleres Beispiel wäre z. B. eine Klasse "Katze", die von "Säugetier" erbt, und "Säugetier" wiederum von "Tier". Denn jede Katze ist ein Säugetier, und jedes Säugetier ist ein Tier. Umgekehrt gilt das nicht.

3

24.10.2015, 05:47

Ich verstehe deinen Anwendungsfall nicht.

Höchstwahrscheinlich ist das, was du tun willst, von der Idee her falsch.

Mit Vererbung stellt man "ist ein"-Relationen dar. Wenn du also z. B. eine Klasse "Schlafen" von einer Klasse "Stapel" erben lässt, dann bedeutet das "Schlafen ist ein Stapel". Es sollte klar sein, dass das Unfug ist.

Ein sinnvolleres Beispiel wäre z. B. eine Klasse "Katze", die von "Säugetier" erbt, und "Säugetier" wiederum von "Tier". Denn jede Katze ist ein Säugetier, und jedes Säugetier ist ein Tier. Umgekehrt gilt das nicht.

Ich verstehe deinen Anwendungsfall nicht.

Höchstwahrscheinlich ist das, was du tun willst, von der Idee her falsch.

Mit Vererbung stellt man "ist ein"-Relationen dar. Wenn du also z. B. eine Klasse "Schlafen" von einer Klasse "Stapel" erben lässt, dann bedeutet das "Schlafen ist ein Stapel". Es sollte klar sein, dass das Unfug ist.

Ein sinnvolleres Beispiel wäre z. B. eine Klasse "Katze", die von "Säugetier" erbt, und "Säugetier" wiederum von "Tier". Denn jede Katze ist ein Säugetier, und jedes Säugetier ist ein Tier. Umgekehrt gilt das nicht.
Ja ich meine es natuerlich umgekehrt:
Schlafen, Essen wird von Stapel abgeleitet:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <vector>

class Stapel
{
public:
 int index;
 std::vector <std::wstring> m_Stapel;
   Stapel()
   {
   index++;
   }
};

//int Stapel::index=0;
//std::vector <std::wstring> Stapel::m_Stapel;

class Schlafen : public virtual Stapel
{
public:
    Schlafen()
   {
   m_Stapel.push_back(L"sofort Schlafen!");
   }

};




class Essen: public virtual Stapel
{
public:
    Essen()
   {
   m_Stapel.push_back(L"Essen");
   }

};


class class_Tagesablauf : public Stapel, Essen
{
public:
    class_Tagesablauf()
    {
    m_Stapel.push_back(L"Tagesbeginn.. auschlafen...");
    fprintf(stderr, "index: %i\n", index);
    }

};


class_Tagesablauf t;


Ich habe einen Tagesablauf von der Art Stapel, daher im Tagesablauf kann ich alle möglichen Aktionen auf den Stapel legen. Mit Ableitungsfunktion von C++ will ich den Tagesablauf mit anderen schon vorhandenen Mindestaktionen, wie Schlafen, Essen festlegen.

ich will mit z.B. class Tagesablauf : Stapel, Schlafen //mit class Schlaf : virtual Stapel
bezwecken, dass Schlaf auf Tagesablauf::Stapel zugreift.
Jetzt besteht, dass Problem, dass Schlaf auf sein eigenen Stapel zugreift und mein Quellcode in Tagesablauf nur mit expliziter Schreibweise auf Stapel-Attribute zugegriffen werden können(statt m_stapel.push_back(...) -> Tagesablauf::m_stapel.push_back(...)).

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

24.10.2015, 05:58

Du hast den Sinn von Vererbung noch nicht verstanden.

Lies meine Antwort nochmal.

Ein Tagesablauf ist kein Stapel und auch kein “Schlafen“.

5

24.10.2015, 06:57

Du hast den Sinn von Vererbung noch nicht verstanden.

Lies meine Antwort nochmal.

Ein Tagesablauf ist kein Stapel und auch kein “Schlafen“.
Ja, das ist klar! - Ein persönlicher Tagesablauf hat aber die Funktion eines Stables, sprich Aktivitäten, die man nach einander durchführt.
Tagesablauf hat noch weitere Inhalte, z.B. Ort, Zeit, etc...

Um es am Beispiel Mensch zu erörtern:

Ich erstelle die Klasse Versammlung, das Grundlegende einer Versammlung ist, dass ein Mensch daran teilnimmt.
Daher:

C-/C++-Quelltext

1
class Versammlung : public Mensch

Wenn man mein Anliegen nicht versteht würde man an

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
30
31
32
33
34
class Versammlung
{
vector<Mensch> m_Teilnehmer;
};
denken. Leider ist das nicht,was ich brauche. Weil ich nicht die Einrichtung programmieren will, sondern sein Wesen, z.B. eine Versammlung in form spezieller Gruppierung:

[cpp]

class Mensch
{
static vector<Mensch> m_Mensch;
static long index=0;
   
}

class Politiker : Mensch
{
//gierig
//Sprachgewand
//hinterhältig
};

class Versammlung_Rede : public Mensch, Politiker, Polizist(1000) // Politiker hält Rede und 1000 Polizisten halten das Volk in Schach, wenn es auser Rand und Band laeuft
{
   public Zuhoehrer_hinzufuegen(Mensch &m)
   {
   m_Mensch.push_back(m);
   index++;
   print("Der neue Zuhoehrer ist das %i-te Mitglied der Veranstalltung.\n");
   }
}

Versammlung_Rede merkel_rede;
merkel_rede.Zuhoehrer_hinzufügen(Mensch{....});

Ausgabe:
Der neue Zuhoehrer ist das 1002-te Mitglied der Veranstalltung.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

24.10.2015, 07:43

Rein aus Interesse: Kann es sein, dass du C++ aus einem Buch von einem gewissen Herrn Wolf "gelernt" hast?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

24.10.2015, 08:52

Wie David schon sagte liegt hier ein grundlegendes Missverständnis darüber vor, wo Vererbung gilt und wo Komposition. Riecht in der Tat sehr nach Jürgen Wolf.

Ein Tagesablauf ist kein Stapel, sondern besteht aus einer Menge von Aktionen in einer Reihenfolge.
Eine Versammlung ist kein Mensch, kein Polizist und auch kein Politiker, sondern besteht aus Teilnehmern.
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]

8

24.10.2015, 12:52

n besteht aus einer Menge von Aktionen in einer Reihenfolge.
>>besteht aus einer Menge von Aktionen in einer Reihenfolge.
Da sind wir uns ja einig.

Was ich eigentlich realisieren will, dass ich eine Art von Versammlung via Klasse definieren moechte:
z.B. ein Konzert
ein Konzert würde ich dann so definieren:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class Band : Mensch(1,4)
{
....
}
class klasse_Konterz : Band(4)
{
Eintritt(Mensch &m) {...}
};


Also um es noch einmal Klar auszudrücken Vererbung unterliegt einer relativ strengen Regel! - Was ich aber machen will ist, dass ich ein Object definiere, dessen festgelegte Grundelemente festgelegt sind. Sagen wir mal wir eine Vorlesung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Professor : public Mensch
{
//Bücherwurm
//....
};
class object_Vorlesung : public Professor, private Techniker
{
 public:
Eintritt(Mensch &m)
{
....
}



}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

24.10.2015, 13:19

Das ist aber schon mal definitiv der falsche Ansatz. Das müsste eher so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Band
{
    std::vector<Mensch> Mitglieder;
};

class Konzert
{
    std::vector<Band> SpielendeBands;
    std::vector<Mensch> Zuschauer;
};

class Vorlesung
{
    Professor Lesender;
    Techniker Helfer;
    std::vector<Student> Zuhoerer;
};


Komposition! Eine Band *besteht aus* 4 (bzw. einer Menge von) Mitgliedern. Was Du da oben stehen hast ist: "Eine Band ist ein Mensch oder mehrere Menschen". Das ist aber falsch. Genau wie ein Apfelbaum nicht 20 Äpfel ist. Ein Apfelbaum *hat* 20 Äpfel.

Der gravierende Unterschied ergibt sich aus den Eigenschaften. Ein Mensch hat eine Größe, ein Geschlecht, eine Augenfarbe. Eine Band hat das alles nicht. Wenn Band von Mensch erbt, dann hätte sie das alles. Und genau das macht keinen Sinn. Für Vorlesung gilt dasselbe. Eine Vorlesung hat kein Geschlecht und keine Augenfarbe. Der Professor schon. Aber der Professor ist eben nur ein Teil der Vorlesung.
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]

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »BlueCobold« (24.10.2015, 13:28)


10

24.10.2015, 13:36

Rein aus Interesse: Kann es sein, dass du C++ aus einem Buch von einem gewissen Herrn Wolf "gelernt" hast?

Das ist aber schon mal definitiv der falsche Ansatz. Das müsste eher so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Band
{
    std::vector Mitglieder;
};

class Konzert
{
    std::vector SpielendeBands;
    std::vector Zuschauer;
};

class Vorlesung
{
    Professor Lesender;
    Techniker Helfer;
    std::vector Zuhoerer;
};


Komposition! Eine Band *besteht aus* 4 (bzw. einer Menge von) Mitgliedern. Was Du da oben stehen hast ist: "Eine Band ist ein Mensch oder mehrere Menschen". Das ist aber falsch. Genau wie ein Apfelbaum nicht 20 Äpfel ist. Ein Apfelbaum *hat* 20 Äpfel.

Der gravierende Unterschied ergibt sich aus den Eigenschaften. Ein Mensch hat eine Größe, ein Geschlecht, eine Augenfarbe. Eine Band hat das alles nicht. Wenn Band von Mensch erbt, dann hätte sie das alles. Und genau das macht keinen Sinn. Für Vorlesung gilt dasselbe. Eine Vorlesung hat kein Geschlecht und keine Augenfarbe. Der Professor schon. Aber der Professor ist eben nur ein Teil der Vorlesung.</band>
Ja Du sagst es. - Nach meinem Kenntnisstand wird auch hier class verwendet? Ist das richtig?
Wie kann ich von einer abgeleiteten Klasse auf die Basisklasse operieren?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Anzahl
{
int anzhal=0;
};

class Teilnehmer
{
public:
Teilnehmer(int anzahl)
{
...
};
}

class Versammlung_Gehirnwaesche : private Politiker, public Zuschauer_Hans // hans greif auf die Attribute von Versammlung_Gehirnwaesche zu
{
...
}

Werbeanzeige