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

Anonymous

unregistriert

1

18.04.2004, 15:43

Listen als template klasse und andere Schauergeschichten

Hallo

Ich hab bis vor kurzem mit meiner eigenen Listenklasse problemlose gearbeitet, bis ich mich entschloss, eine Klasse abzuleiten, bei der mr ne Position in der Liste setzen und abfragen kann, dass z. B. folgendes möglich ist:

Quellcode

1
2
3
4
5
6
//die ganze Liste auflisten:
for (int iLoopVar=0;iLoopVar<pList->GetUICount();iLoopVar++)
{
  pList->MovePos(1);
  pList->GetP()->...//Irgendwas mit dem Listenelement machen
}


(denn bisher gings nur so:

Quellcode

1
2
3
4
5
//die ganze Liste auflisten:
for (int iLoopVar=0;iLoopVar<pList->GetUICount();iLoopVar++)
{
  pList->GetP(iLoopVar)->...//Irgendwas mit dem Listenelement machen
}


Aber der Kompiler übernimmt die Methode "GetP" nicht in die derived class, obwohl sie nur mit unterschiedl. Parametern überladen wird! Er gibt mir Fehlermeldungen wie:

"error C2660: 'GetP' : Funktion akzeptiert keine 1 Parameter"

Ich wäre echt froh, wenn mir jemand helfen könnte!

Samuel G.[/code]

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

2

18.04.2004, 16:46

Also ich kann den Compiler verstehen:

Soweit ich weiss gibt es sowas nicht!

Quellcode

1
pList->GetP(iLoopVar)->


es gibt:

Quellcode

1
pList->GetP(iLoopVar);


oder

Quellcode

1
pList->GetP->Ein_Struct_Member;


aber nicht das oben. Mein erstes Beispiel wäre eine Funktion, das zweite entweder eine Struktur, Union oder Class.

Anonymous

unregistriert

3

18.04.2004, 18:06

Mistverständnis

Das war ein Mistverständnis! :-D :-D :-D

Die drei Punkte sollen für eine Memberfunktion des von der Liste zurückgegebenen Zeigers stehen! O.K. Ich hätts vielleicht deutlicher darstellen können.

Übrigens: Die Code Schnipsel sind stilisiert und vereinfacht, beschreiben aber die Problemsituation.

Ich hoffe auf Hilfe. :crying: :crying: :crying:

Samuel G. :)

4

18.04.2004, 18:29

Hummhomm. Etwas mehr Informationen wären vielleicht nicht schlecht...

Also wild geraten würd ich sagen, dass sich dein Problem lösen lassen könnte wenn du nicht den Basisklassenzeiger nimmst, sondern einen der abgeleiteten Klasse. Oder ist das schon der Fall? Lass uns doch an deinem Code teilhaben.

5

18.04.2004, 18:39

Zitat

Soweit ich weiss gibt es sowas nicht!

Quellcode

1
pList->GetP(iLoopVar)-> 
Das geht wohl. Die Methode muss nur einen Pointer als Rückgabewert liefern. Ich verwende das dauernd.


Wenn du eine Methode mit gleichem Namen aber anderen Paramtern in der Abgeleiteten Klasse Definierst, wird die Definition der Methode in der Basisklasse überlappt und ist nicht mehr sichtbar. Hier könnte sich der Fehler verstecken.

Allerdings wäre es hilfreich wenn du mal die Definition deiner Klassen zu posten, dann können wir dir vieleicht besser helfen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

6

18.04.2004, 18:56

Richtig, vielleicht hilft dir auch Bruce Eckel, sein Thinking In C++ kann man kostenfrei auf seiner Homepage http://www.bruceeckel.com/ runterladen. Im Kapitel 15: Polymorphism & Virtual Functions steht unter Overloading & overriding eigentlich alles was man wissen muss.

Anonymous

unregistriert

7

18.04.2004, 20:24

Code-Posting

Also hier meine klassendeklarationen (Ich wollte nur verhindern, dass ihr abgeschreckt werdet!):

Also das ist eine Basisklasse für versch. Listen-Klassen:

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
template <typename TTyp> class sgCListBase
{
    protected:
        bool m_bAutoDelete;
        unsigned int m_uiCountListElement;
        CListElement<TTyp>* m_pListElementFirst,* m_pListElementLast;

        virtual inline CListElement<TTyp>* PrivateGetPListElement(const int iIndex) const;
    public:
        inline sgCListBase(bool bAutoDelete=true);
        inline sgCListBase(const TTyp* ap[],
                       const unsigned int uiCount,
                       bool bAutoDelete=true);
        inline sgCListBase(const sgCListBase& List);
        virtual inline ~sgCListBase(void);

        inline void AddP(TTyp* p);
        inline void DeleteP(const unsigned int uiIndex);
        inline void DeleteP(const TTyp* p);
        inline void Clear(void);
        inline void InsertP(TTyp *p,const unsigned int uiInsertAfter);

        inline const sgCListBase<TTyp>& operator=(const sgCListBase<TTyp>& List);

        inline TTyp* GetP(const unsigned int uiIndex) const;
        inline unsigned int GetUIIndex(const TTyp* p) const;

        inline unsigned int GetUICount(void) const;
};


Davon leite ich sgList ab (welche die Funktionalität um einen "Schreib-Lese-Zeiger" erweitert (Setzen mit SetUIIndexPosition, abfragen mit GetUIIndexPosition)):

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
template <typename TTyp> class sgCList: public sgCListBase<TTyp>
{
    protected:
        int m_iIndexPosition;
        CListElement<TTyp>* m_pListElementPosition;

        //hier müsste noch m_iIndexPosition==-1 berücksichtigt werden!:
        virtual inline CListElement<TTyp>* PrivateGetPListElement(const int iIndex) const;
    public:
        inline sgCList(bool bAutoDelete=true);
        inline sgCList(
            const TTyp* ap[],
            const unsigned int uiCount,
            bool bAutoDelete=true,
            const unsigned int uiIndexPosition=0
        );
        inline sgCList(const sgCList& List);
        virtual inline ~sgCList(void);

        inline void SetUIIndexPosition(const unsigned int uiIndex);

        inline void DeleteP(void);
        virtual inline void InsertP(TTyp *p);

        inline const sgCList<TTyp>& operator=(const sgCList<TTyp>& List);

        inline unsigned int GetUIIndexPosition(void) const;
        inline TTyp* GetP(void) const;
        inline unsigned int GetUIIndex(void) const;
};


Samuel G. :) :) :)

8

18.04.2004, 20:58

Die Methode sgCListBase::GetP wird von der Methode sgCList::GetP verdeckt. Daher ist ein aufruf nicht mehr möglich. Du solltest diese Entweder als Virtual deklarieren, oder besser noch du setzt in der Basisklasse einen Std. Wert für den Parameter (z.B. -1). Dann brauchst du auch nicht mehr die Methode nochmals neu schreiben.

Zudem seh ich die sgCList::MoveP Methode nicht.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

9

19.04.2004, 07:12

@ Drogonmaster:
stimmt, stimmt, stimmt ;D :jumpy:

Anonymous

unregistriert

10

19.04.2004, 18:34

Also ich hab jetzt die funktionen virtuell deklariert, es hat sich aber leider nichts geändert (wein :crying: :crying: :crying: ).

Aber abgesehen davon: Warum soll ich die Funktionen virtuell deklarieren wo ich doch

1. Die Funktionen der Basisklasse nicht überschreiben will
2. Dieses sowieso nicht gehen würde, da andere Parameter

Nochmal (nur um sicher zu gehen): Ich möchte das sgCList sowohl die alten sowie die "neuen" Methoden hat. Ich möchte sie einfach mit unterschiedl. Parametern überladen.

Ich hoffe auf Unterstützung.


Samuel G.

Werbeanzeige