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

DaiFei

Frischling

  • »DaiFei« ist der Autor dieses Themas

Beiträge: 28

Wohnort: München

  • Private Nachricht senden

1

27.03.2014, 13:01

Problem mit Zeiger-Datentyp als typedef einer Klasse

Hallo zusammen,

ich hätte da eine Frage bezüglich dem typedef von Klassen für entsprechende Zeiger. So zum Beispiel in dieser Form:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
typedef class CKlasse
{
   // KONSTRUKTOR, DESTRUKTOR, MEMBER, METHODEN ...

   // Überladene Operatoren
   CKlasse& operator /= (const CKlasse&);

} CKlasse, * PCKlasse;


Es geht also darum, einen Zeiger-Datentyp der Klasse zu erhalten (PCKlasse). Nun könnte die Implementierung des Operators so aussehen:

C-/C++-Quelltext

1
2
3
4
5
// Klassen-Methode (bzw. Operator)
CKlasse& CKlasse::operator /= (const CKlasse& k)
{
   return *this *= (*ExterneFunktion(&k));
}


Wobei die Externe Funktion so aussehen könnte:

C-/C++-Quelltext

1
2
3
4
5
// Eine nicht explizit zur Klasse gehörende Funktion
PCKlasse ExterneFunktion(PCKlasse ptr)
{
    // modifiziere ptr und liefere das Ergebnis (sprich den Argument-Zeiger) auch als Rückgabewert
}


Jetzt geht es jedoch gar nicht um spezielle Funktionen oder Methoden, sondern um den Umstand, dass mir der Compiler die Fehlermeldung in der operator-Implementation ausspuckt, dass const CKlasse * nicht in const PCKlasse umgewandelt werden kann (beim Aufruf von ExterneFunktion()), wobei ich jetzt allerdings dachte, dass es das Selbe sei. Würde ich alle PCKlasse(n) mit CKlasse* ersetzen, so läuft wieder alles einwandfrei. Wird jedoch ExterneFunktion() mit einem PCKlasse-Argument in der main()-Funktion aufgerufen, so akzeptiert der Compiler dies ebenfalls. Nur bei Klassen-Methoden will er da scheinbar nicht so recht. Vermute mal, dass ich da etwas Grundsätzliches von typedef nicht so ganz verstanden habe. Vielleicht könnt ihr mir helfen. Danke!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

27.03.2014, 13:12

Jetzt geht es jedoch gar nicht um spezielle Funktionen oder Methoden, sondern um den Umstand, dass mir der Compiler die Fehlermeldung in der operator-Implementation ausspuckt, dass const CKlasse * nicht in const PCKlasse umgewandelt werden kann (beim Aufruf von ExterneFunktion()), wobei ich jetzt allerdings dachte, dass es das Selbe sei.

Ist nicht dasselbe. const CKlasse * ist ein Pointer auf ein const CKlasse, während const PCKlasse ein const Pointer auf ein CKlasse ist...

DaiFei

Frischling

  • »DaiFei« ist der Autor dieses Themas

Beiträge: 28

Wohnort: München

  • Private Nachricht senden

3

27.03.2014, 13:30

Ah verstehe, danke! Gibt es überhaupt eine Möglichkeit, eine dafür passende PCKlasse zu definieren?

Ich meine im Stile von

C-/C++-Quelltext

1
2
3
4
5
6
7
8
typedef class CKlasse
{
   // KONSTRUKTOR, DESTRUKTOR, MEMBER, METHODEN ...

   // Überladene Operatoren
   CKlasse& operator /= (const CKlasse&);

} DEFINITION VON PCKlasse;


Folgendes würde ja funktionieren, ist mir mit dem const allerdings zu speziell.

C-/C++-Quelltext

1
typedef const CKlasse* PCKlasse;


Oder ist es überhaupt sinnvoller, die jeweiligen Funktionen anders zu definieren?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

27.03.2014, 13:32

Mir ist generell eigentlich eher unklar, wofür genau das mit dem typedef überhaupt gut sein soll. Wieso nicht einfach

C-/C++-Quelltext

1
2
3
4
class Klasse
{
  ...
};

und fertig!?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

27.03.2014, 13:34

Microsoft macht(e) das in ihrer (alten) Windows-API überall. Furchtbar. Auch das C-Präfix ist grausam.
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

27.03.2014, 13:36

Microsoft macht(e) das in ihrer (alten) Windows-API überall.

Ja, aber das ist eine C API. In C gibt es zumindest einen Grund für diese Verwendung von typedef, in C++ dagegen ist das völlig überflüssig und imo kein guter Stil...

Auch das C-Präfix ist grausam.

jap...und auch nicht im Sinne des Erfinders...

DaiFei

Frischling

  • »DaiFei« ist der Autor dieses Themas

Beiträge: 28

Wohnort: München

  • Private Nachricht senden

7

27.03.2014, 13:41

Das C steht bei meinen Klassen für "Mir fällt (noch) kein Name für meine Engine ein". Ist also eher ein Platzhalter.

Das typedef habe ich zwar wirklich gemäß dem Vorbild des DirectX-SDK's übernommen, finde aber so einen Zeiger-Datentyp für so manche Klasse tatsächlich recht praktisch.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

27.03.2014, 13:43

Nein. Mach's ordentlich. Von Anfang an. Das gilt sowohl für Typen, als auch für ihre Namen. Die Typedefs gehören da nicht hin und Präfixe sind seit 15 Jahren nicht mehr modern, weil gute Namen für Bezeichner absolut ausreichend sein sollten und auch sind.
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]

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

9

27.03.2014, 13:48

Öh, erstens: PKlasse und Klasse* verwenden exakt gleich viele Zeichen, bloß dass Klasse* optisch schneller mitteilt, worum es geht. Was ich noch nachvollziehen könnte wäre: using SPKlasse = std::shared_ptr<Klasse>;

Zweitens: Der Stil ist wirklich grausig... meide ihn wo es nur geht. D:

Drittens: Ich arbeite ohne Präfixe. Die gehen mir schon bei jedem C-API auf die Nerven. Verwende lieber Namespaces, denn dazu sind die Dinger da.

C-/C++-Quelltext

1
2
3
4
5
6
7
// Aus das:
class CKlasse {...};

// Mach das:
namespace MyEngine {
  class Klasse {};
} // namespace MyEngine

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

DaiFei

Frischling

  • »DaiFei« ist der Autor dieses Themas

Beiträge: 28

Wohnort: München

  • Private Nachricht senden

10

27.03.2014, 14:05

Alles klar, danke für die Antworten! Dann werde ich wohl nochmal meinen Stil überdenken und zumindest namespaces einsetzen.

Bin bis dato davon ausgegangen, bestimmte SDK's, wie z.B. das von DirectX, auch programmier(stil)technisch als Referenz verwenden zu können. "Kann schon nicht so schlecht sein, wenn so viel (professionelles/kommerzielles) darauf aufbaut." :)

Werbeanzeige