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

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

11

11.01.2010, 18:45

*hust* Grundlagen *hust*

mit

Quellcode

1
void Init()


definierst du eine neue Funktion. Die Methode deiner Klasse wird wie üblich über
TYP KLASSE::Methode( PARAMETER )
{
CODE
}

definiert...

12

11.01.2010, 18:49

oh man, warum überseh ich immer die einfachen dinge :oops:
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

13

11.01.2010, 22:28

Übrigens sind Init-Funktionen C-Style. In C++ stellen Konstruktoren in den meisten Fällen die bessere Wahl dar.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

14

11.01.2010, 23:01

Zitat von »"Nexus"«

Übrigens sind Init-Funktionen C-Style. In C++ stellen Konstruktoren in den meisten Fällen die bessere Wahl dar.

Aber nur wenn sie public sind. Private verwende ich gerne auch selbst, wenn du z.B mehrere Konstruktoren hast, dann ist das wohl der bessere Weg, als den Code zu duplizieren.

15

12.01.2010, 01:25

Zitat von »"drakon"«

Aber nur wenn sie public sind. Private verwende ich gerne auch selbst, wenn du z.B mehrere Konstruktoren hast, dann ist das wohl der bessere Weg, als den Code zu duplizieren.
Ja, bei einigem Code im Konstruktorrumpf mache ich das natürlich auch so. Ich bezog mich hier auf öffentliche Init-Funktionen. ;)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

16

12.01.2010, 15:38

nexus was machst du wenn du ein std::vector/array mit objekten hast? dann kannst du dem konstrukor keine werte übergeben. dann muss man wieder mit zeigern arbeiten.(was sich nur bei klassen lohnt, die relativ viel speicher benötigen)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

17

12.01.2010, 17:46

Zitat von »"NachoMan"«

nexus was machst du wenn du ein std::vector/array mit objekten hast? dann kannst du dem konstrukor keine werte übergeben. dann muss man wieder mit zeigern arbeiten.(was sich nur bei klassen lohnt, die relativ viel speicher benötigen)


Grundsätzlich sollte sich ein Objekt, nachdem es konstruiert ist in einem konsistenten und korrekten Status befinden. Dann kannst du das Objekt im Nachhinein immernoch verändern.

/EDIT:
btw kann man mit std::vector sehr gut Argumente angeben..

C-/C++-Quelltext

1
2
3
4
5
struct foo { foo ( int i ){} }; // kein default ctor!

int main ()
{
 std::vector<foo> v ( 1000, foo ( 2 ) ); // objekt für Konstruktion angeben

}

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

18

12.01.2010, 21:58

ja klar, ich benutze konstruktoren um zeiger und variablen auf null bzw. den eigenen wert zu setzen. danach werden der initfunktion die werte übergeben.

bei dem beispiel mit std::vector muss man allen objekten den gleichen wert übergeben. auch nicht das wahre.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

19

12.01.2010, 22:18

Es geht darum, dass du ein konsistentes Objekt nach dem Konstruktor aufruf hast und es soll nicht erst Sinn machen, wenn ein User die Init Funktion aufgerufen hat.

Das alleinige ändern eine Variable ist ja kein Problem. Das kannst du mit einem Setter machen. Das gehört aber nicht in eine Init Funktion.

Die Invariante eines Objektes sollte gegeben sein, sobald es konstruiert ist. Es darf nicht sein, dass ein halbkonstruiertes Objekt rumschwirrt.

20

12.01.2010, 23:14

Zitat von »"NachoMan"«

ja klar, ich benutze konstruktoren um zeiger und variablen auf null bzw. den eigenen wert zu setzen. danach werden der initfunktion die werte übergeben.
Warum zuerst dummy-initialisieren, um die Werte gleich wieder zu überschreiben?

Ich initialisiere grundsätzlich fast alles in der Konstruktor-Initialisierungsliste. Natürlich gibt es Member, deren Initialisierung mehr Aufwand erfordert, aber das geschieht dann im Konstruktorrumpf. Je nach Codegrösse und Wiederverwendungswahrscheinlichkeit lagere ich diese Dinge in Funktionen aus, aber beim Beenden des Konstruktor-Aufrufs ist das Objekt intialisiert. Natürlich gibt es auch hier Ausnahmen, wo wirklich eine verzögerte Initialisierung notwendig ist. Aber das sind sehr wenige Fälle, welche zudem immer noch gekapselt behandelt werden können.

Zitat von »"NachoMan"«

bei dem beispiel mit std::vector muss man allen objekten den gleichen wert übergeben. auch nicht das wahre.
Muss man nicht. Man hat etliche Möglichkeiten, den std::vector während der Konstruktion des Objekts zu füllen.

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
// 1. Möglichkeit --------------------------------

MyClass::MyClass
: MyVector()
{
    MyVector.push_back(X);
    MyVector.push_back(Y);
}

// 2. Möglichkeit --------------------------------

std::vector<XY> CreateVector();

MyClass::MyClass
: MyVector(CreateVector())
{
}

// 3. Möglichkeit --------------------------------

void FillVector(std::vector<XY>& Vector);

MyClass::MyClass
: MyVector()
{
    FillVector(MyVector);
}

Werbeanzeige