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

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

21

16.02.2006, 23:35

1) Nein... Grundsätzlich definiert man alle Operatoren, welche direkt die aktuelle Instanz der Klasse verändern (so zB Zuweisungsoperatoren [=, +=, ...]) IN der Klasse, und alle anderen außerhalb (zB. Arithmetische Operatoren)

2) Wenn du eine Instanz der Klasse anlegst, kannst du in der CPP ganz normal damit arbeiten... Wenn du das nicht meinst, erklärs bitte nochmals...

3) Meinst du mit protected final protected? Wenn ja, protected hat nur irgendwelche Auswirkungen, wenn du eine KLasse vererbst... sonst genügen private und public vollkommen (vor allem ist OHNE Vererbung protected == private)
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

DaRich

Frischling

Beiträge: 24

Wohnort: Ingolstadt

Beruf: Student

  • Private Nachricht senden

22

17.02.2006, 09:39

Vielen Dank @ Black-Panther[list]zu 1.) also wenn ich den oben angesprochenen - operator aber außerhalb der klasse also so

C-/C++-Quelltext

1
2
3
4
5
6
class tbMatrix
{
private:
    float m11, ...;
};
inline tbMatrix operator - (&tbMatrix v) {return tbMatrix(-v.m11, ...)}

definiere, erhalte ich einen Sichtbarkeitsfehler.

zu 2.) doch genau das meinte ich, thx

zu 3.) da hast du natürlich recht, bin während des letzten Semesters ziemlich eingerostet ^^ + ich meinte natürlich public const[/list]ich habe so langsam das Gefühl, dass die Vorstellungen, was eine Klasse ist in JAVA und C++ grundverschieden sind ???
obwohl es natürlich stimmt, dass die operatoren natürlich nicht dem objekt, sondern der klasse gehören. Desweiteren ist eine Matrix-Klasse natürlich eine mathematische Klasse und somit eher static.

Muss meinen Ansatz wohl noch mal von grundauf überdenken.
Vielen Dank solange an alle, die ich mit meinen nOOb-Fragen genervt hab.

grEEtz
bis denne
>>> DaRich <<<

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

23

17.02.2006, 10:17

1. Es müsste gehen wenn du die Operatoren mit friend in der Klasse bekannt gibst, also

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class tbMatrix
{
private:
    float m11; //...

public:
    friend tbMatrix operator - (&tbMatrix v);
};
inline tbMatrix operator - (&tbMatrix v) {return tbMatrix(-v.m11/*, ...*/)}

Ich habe übrigens schon öfter gesehen, dass diese Operatoren in der Klasse deklariert werden und hätte es spontan auch so gemacht. Panther kannste vielleicht mal erläutern warum man das nicht machen sollte?

Statische Klasse existieren immer nur in einer Instanz. Ich glaube nicht, dass du das willst, weil du dann wirklich nur eine einzige globale Matrix hättest.

DaRich

Frischling

Beiträge: 24

Wohnort: Ingolstadt

Beruf: Student

  • Private Nachricht senden

24

17.02.2006, 10:56

@ Spik)evil(

ja so funktioniert es, habe es gestern schon so getestet, aber dann kann ich den Operator gleich innerhalb der Klasse definieren, wie du schon sagtest, weil er ja eh nur aus einem RETURN-Wert besteht.

Naja ich denke, dass man da irgendwo einen Kompromiss machen muss, entweder man entscheidet sich die Attribute public zu machen, was nicht ganz sauber ist oder man entscheidet sich die Operatoren innerhalb der Klasse zu definieren.

Ich hätte noch einen Vorschlag, wie man einen Mittelweg gehen könnte:
man deklariert die Attribute public const, so das zwar jeder auf sie zugreifen kann, aber niemand schreiben.

meinte eigentlich statische Methoden

thx für deine Antwort
grEEtz
>>> DaRich <<<

Anonymous

unregistriert

25

17.02.2006, 11:27

Hi!

Ich hab jetzt hier grad keinen Compiler um das zu testen, aber eigentlich
müsste das folgendermassen laufen:

datei.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class tbMatrix
{
private:
    float m11, ...;
public:
   // Prototyp fuer den Operator

   tbMatrix operator - (&tbMatrix v);
};


datei.cpp

C-/C++-Quelltext

1
2
3
4
tbMatrix tbMatrix::operator - (&tbMatrix v) 
{
  return tbMatrix(-v.m11, ...)
}


So mach ich das immer - Klassendeklaration von der Implementierung sauber getrennt.
Da brauch man keinen friend-Modifizierer und auch keine inline-Deklaration.

Grüße
Stefan

DaRich

Frischling

Beiträge: 24

Wohnort: Ingolstadt

Beruf: Student

  • Private Nachricht senden

26

17.02.2006, 11:45

Hi @ scarsen

sag schon mal vielen dank für deine bemühungen, kann es leider auch erst später testen, weil ich auch keinen compiler auf dieser lahmen krücke hier habe ^^

sieht gut aus,
aber ich würde trotz allem den Prototyp inline deklarieren, da der operator ja nichts weiter macht, als einen Wert zurückzugeben.

ich glaube hier entsteht die flitzeschnellste, sicherste matrixklasse in teamarbeit ^^

grEEtz
bis denne
>>> DaRich <<<

Anonymous

unregistriert

27

17.02.2006, 11:55

Hi!

Noch mal ich ;)

Nur als Info:

Zitat

GCC automatically inlines member functions defined within the class body of C++ programs even if they are not explicitly declared inline. (You can override this with -fno-default-inline; see Options Controlling C++ Dialect.)


D.h. dass der GCC deinen Operator autmatisch inline machen würde, auch
wenn du ihn nicht so deklarierst. Aber inline davor zu schreiben ist in jedem
Fall guter Stil!

Wie das mit Microsoft-Compilern ist, weiß ich aber nicht, da ich fast nur
Open Souce Software nutze - da müsstest du mal irgendwo in eurer Doku
nachsehen.

Grüße
Stefan

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

28

17.02.2006, 11:57

Wenn die const sind, kannst Du sie aber auch innerhalb der Klasse nicht ändern. Naja, geht natürlich schon (mit C++), aber das wäre unschön und unsauber.

Bei solchen "simplen" mathematischen Klassen, wie z.B. Vector, Matrix etc., oder generell bei Klassen, deren Attribute sowie -- sofern sie private wären -- über Getter- und Setter-Methoden frei ansprechbar und auch frei setzbar sind, mache ich die Attribute stumpf public.
Einige Designer mögen mich jetzt zwar hängen sehen, weil es zum Teil der Kapselungsidee widerspricht, aber ich persönlich finde es um einiges übersichtlicher und vorteilhafter, wenn ich public-Attribute habe, anstelle von private- oder protected-Attributen, die sowieso ohne Restriktionen frei änderbar sind -- über die Setter-Methoden...

DaRich

Frischling

Beiträge: 24

Wohnort: Ingolstadt

Beruf: Student

  • Private Nachricht senden

29

17.02.2006, 12:16

@ scarsen
danke für die info
ich weiß von MS compiler von VS6, dass er überflüssige inline automatisch entfernt, hinzufügen weiß ich nicht ^^

@ steven77
ja das ist wohl die beste möglichkeit, aber ich habe es für meinen geschätzten Info-Prof versucht, der immer gefordert hat, alle Attribute private ^^
wenn ich mit const arbeite müsste ich halt für jede(n) Operator/Funktion/..., der/die/... Attribute ändern will ein neues Objekt kreieren. Muss ich mir noch überlegen :D

vielen dank bis dahin ... ich muss weg ;)
bis später
grEEtz
>>> DaRich <<<

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

30

18.02.2006, 14:13

Also normalerweise definiert man die Membervariablen als private... Ich mach das auch (fast) immer... Hab nur bei der Matrix und Vektorklasse eine Ausnahme gemacht...
Soweit ich weiß, entfernt der Compiler die inline nicht nur, sondern fügt sie auch hinzu... Trotzdem ist es besser inline-Funktionen als solche zu deklarieren, und "Inlines" deklariert und implementiert man IMMER in der Headerdatei!

@Spik)evil(

Zitat

Ich habe übrigens schon öfter gesehen, dass diese Operatoren in der Klasse deklariert werden und hätte es spontan auch so gemacht. Panther kannste vielleicht mal erläutern warum man das nicht machen sollte?


Zitat

1) Nein... Grundsätzlich definiert man alle Operatoren, welche direkt die aktuelle Instanz der Klasse verändern (so zB Zuweisungsoperatoren [=, +=, ...]) IN der Klasse, und alle anderen außerhalb (zB. Arithmetische Operatoren)


--> Das heißt einen Teil der Operatoren definiere ich IN der einen anderen Teil außerhalb der Klasse...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Werbeanzeige