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

31.03.2014, 15:10

Array-Cast-Operator?

Ich habe einen 3D-Punkt-Typen, der drei doubles verwaltet. Ist es jetzt möglich, einen Cast-Operator zu überladen, sodass ich so was schreiben kann (wie sähe die Signatur aus?):


C-/C++-Quelltext

1
2
3
double[3] foo = { 0.0, 0.0, 0.0 };
Point3D p;
p = foo; // !!


Ansonsten muss ich immer manuell:

C-/C++-Quelltext

1
2
3
p.x = foo[0];
p.y = foo[1]
...


machen

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

2

31.03.2014, 15:27

Klar geht das. Du kannst den Zuweisungsoperator überladen. Hier mal ein einfaches Beispiel um zu verdeutlichen wie du es angehen könntest:

C-/C++-Quelltext

1
2
3
4
5
Point3D Point3D::operator=(double arg[3]) {
   this->x = arg[0];
   this->y = arg[1];
   this->z = arg[2];
}
Liebe Grüße,
René

3

31.03.2014, 15:37

Oder falls es wirklich NUR mit Arrays von drei doubles gehen soll:

Quellcode

1
operator = (double const (&arg)[3])
Spricht außerdem irgendwas gegen

Quellcode

1
Point3D p = { 0.0, 0.0, 0.0 };
?

4

01.04.2014, 14:56

Quellcode

1
operator = (double const (&arg)[3])


Wo ist denn da der Unterschied zur obigen Version außer dem const? Wie liest man den Datentyp überhaupt? Ein Referenz-Array auf const double? Die zweite Variante geht natürlich auch, aber wenn z.B. ne Funktion sowieso ein double[3] zurückgibt, muss man es nicht extra wieder aufdröseln. ;)

5

02.04.2014, 15:52

Wo ist denn da der Unterschied zur obigen Version außer dem const?
Die obige Version nimmt einen Zeiger als Parameter; meine nimmt ein Array.

Quellcode

1
2
3
double d = 0.0;
Point3D p;
p = &d;
würde, obwohl unbeabsichtigt, mit Renegades Version gehen kompilieren und mit meiner nicht. Und da kein Zeiger auf const double übergeben wird, könnte Renegades Operator auch noch in die übergebenen Daten schreiben.

Dass Arrays in Funktionsköpfen Zeiger bedeuten (und nicht Arrays), ist C-Erbe. Ebenso kann keine Funktion Arrays zurückgeben. Darum muss man mit der unintuitiven Syntax leben.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Krishty« (02.04.2014, 16:34)


FSA

Community-Fossil

  • Private Nachricht senden

6

02.04.2014, 16:56

Darf ich fragen, warum man es nicht auch so machen kann?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
union
{
    struct
    {
        float x;
        float y;
        float z;
    };
    float       a[3];
};

operator float* ()                  {return static_cast<float*>(a);}


Edit: Entschuldigung, natürlich bei dir dann mit double.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

7

02.04.2014, 19:33

Klar kann man das so machen.
Der Cast ist übrigens total überflüssig. Ich sehe nur keinen Zusammenhang zum Thema.
Mit der Weise geht es genau in die andere Richtung als beim Fragesteller.
Außerdem finde ich die Methode potentiell gefährlich, weil sich damit auch leicht versehentlich ungewollt ein Objekt in einen Pointer umwandeln lässt.

FSA

Community-Fossil

  • Private Nachricht senden

8

02.04.2014, 20:14

Ah Mist verwechselt.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

9

02.04.2014, 22:31

Wo ist denn da der Unterschied zur obigen Version außer dem const?
Die obige Version nimmt einen Zeiger als Parameter; meine nimmt ein Array.

Quellcode

1
2
3
double d = 0.0;
Point3D p;
p = &d;
würde, obwohl unbeabsichtigt, mit Renegades Version gehen kompilieren und mit meiner nicht. Und da kein Zeiger auf const double übergeben wird, könnte Renegades Operator auch noch in die übergebenen Daten schreiben.

Dass Arrays in Funktionsköpfen Zeiger bedeuten (und nicht Arrays), ist C-Erbe. Ebenso kann keine Funktion Arrays zurückgeben. Darum muss man mit der unintuitiven Syntax leben.


Danke für die Verbesserung. Macht Sinn deine Erklärung!
Liebe Grüße,
René

Werbeanzeige