• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

C++ Zugriff auf Objekte anderer Klassen in einer Memberfunktion

Oche

Neu angemeldet

Registriert
21 Aug. 2014
Beiträge
12
Tach Leute,

bin grad an einem Problem, das ich durch Recherche einfach nicht gelöst bekomme.

Der Titel oben besagt worum es sich bei meinem Problem handelt.

Ich poste mal den Code:

class Wand{
public:
double berechneFlaeche(Tuer, Fenster)
};

double Wand::berechneFlaeche(Tuer t, Fenster f){
//hier kommt noch Code rein...
}

int main(void){
Wand w;
Tuer t;
Fenster f;


return 0;
}
 
Zuletzt bearbeitet:

Larius

OutOfOrder

Registriert
12 Juli 2013
Beiträge
5.792
Also zumindest für mich ist jetzt nicht wirklich ersichtlich WAS genau du vor hast, nichtmal mit dem Thread Titel. Kannst du es etwas spezifizieren?
 

Oche

Neu angemeldet

Registriert
21 Aug. 2014
Beiträge
12
  • Thread Starter Thread Starter
  • #3
Ich habe 3 Klassen,
erstelle in der main() zwei Instanzen Tuer t und Fenster f der beiden Klassen Tuer und Fenster
und möchte in der Klasse Wand damit arbeiten.
Ist dies möglich?
 

deSk

Neu angemeldet

Registriert
14 Feb. 2014
Beiträge
28
Klar ist dies möglich und auch nicht wirklich schwer ;)

in die Main erstellt du noch eine double Variable also
[src=cpp]
double wert = w.berechneFlaeche(t,f);
[/src]
jedoch verstehe ich nicht wieso du eine Klasse mit nur einer Instanzmethode erstellst , die Klasse ergibt für mich keinen Sinn. Eine kleine Funktion würde dafür auch ausreichen.
Nagut vlt. tust du sie ja noch erweitern =)
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Der Kontext scheint mir etwas unklar. Du hast den Code vorgegeben und musst ergänzen, oder? Der ist doch nicht von dir, so wie das aussieht.
Oder wo ist das Problem mit deiner Methode
[src=cpp]
double berechneFlaeche(Tuer, Fenster);
[/src]
?


Ich persönlich finde es nicht so toll, jemandem, der nen recht lieblosen Beitrag (src tags??) hinklatscht seine vermeintlichen Hausaufgaben zu machen.

Aber mal davon abgesehen:
Meines erachtens würde man das eher mit Aggregation lösen:
[src=cpp]
class Wand{
public:
[...]
double berechneFlaeche();
bool addWindow(Koordinaten k);
bool addDoor(Koordinaten k);
[...] // u.a. getter/setter
private:
std::vector<Tuer> tuerListe;
std::vector<Fenster> fensterListe;
};
[/src]
 
Zuletzt bearbeitet:

Oche

Neu angemeldet

Registriert
21 Aug. 2014
Beiträge
12
  • Thread Starter Thread Starter
  • #6
Danke für eure Hilfe,

hab das Problem gelöst bekommen, war aber keine Hausaufgabe sondern Klausurvorbereitung.

Schönes Wochenende!
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Es ist mMn höflich, die Lösung dann auch zu nennen. Sonst surft z.B. nächstes Jahr wegen der selben Frage hier her und findet keine Antwort.
 

Oche

Neu angemeldet

Registriert
21 Aug. 2014
Beiträge
12
  • Thread Starter Thread Starter
  • #8
[src=cpp]#include <iostream>

using namespace std;

class Rechteck{
public:
double hoehe;
double breite;
};

class Tuer : public Rechteck{

};

class Fenster : public Rechteck{

};

class Wand : public Rechteck{
public:
double berechne_Flaeche(Tuer, Fenster);
};

double Wand::berechne_Flaeche(Tuer t, Fenster f){
//Wandfläche = HöheWand * BreiteWand - HöheTür * BreiteTür - HöheFenster * BreiteFenster
return (hoehe*breite - t.hoehe*t.breite - f.hoehe*f.breite);
}

int main(void){
Wand w;
Tuer t;
Fenster f;

cout << "Eingaben fuer Wand, Tuer, Fenster:" << endl;
cout << "Hoehe = ? ";
cin >> w.hoehe;
cout << "Breite = ? ";
cin >> w.breite;
cout << "Hoehe = ? ";
cin >> t.hoehe;
cout << "Breite = ? ";
cin >> t.breite;
cout << "Hoehe = ? ";
cin >> f.hoehe;
cout << "Breite = ? ";
cin >> f.breite;

cout << "Wandflaeche = " << w.berechne_Flaeche(t, f) << endl;

return 0;
}
[/src]
die letzte Zeile vor return 0; war zu ergänzen um in der Klasse Wand Zugriff auf die Instanzen t und f zu erhalten.
Hatte anscheinend Probleme mit der Syntax.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
Lerne auch gerade C/C++ - aber musst du nicht erst einmal die Klassen mittels "new", also "Wand w = new Wand" als Instanzen diser Klassen setzen ?
 

Oche

Neu angemeldet

Registriert
21 Aug. 2014
Beiträge
12
  • Thread Starter Thread Starter
  • #10
@theSplit:
Wieso?
ich will die Instanz doch nicht dynamisch erzeugen, brauch doch nur eins.
Erzeugt man das nicht in dem Fall mit new, wenn man nicht weiß wie viele man braucht, also zur Laufzeit?
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
Wenn ich richtig verstehe, erzeugt das "new" als Keyword/Schlüsselwort eine Instanz einer Klasse die vorher deklariert wurde.
Also dass dann erst mit der Klasse gearbeitet werden kann.
 

Oche

Neu angemeldet

Registriert
21 Aug. 2014
Beiträge
12
  • Thread Starter Thread Starter
  • #12
Ich hab jedenfalls noch nie davon gehört, bzw es noch nie benutzen müssen.
Aber vielleicht brauch ich es ja irgendwann mal
 

Asseon

Draic Kin

Registriert
14 Juli 2013
Beiträge
10.353
Ort
Arcadia
iirc erzeugt new die klasse im HEAP ohne landet sie im stack, dessen Größe zur linktime festgelegt wird und ich meine meist bei 1 MiB liegt.
der HEAP dagegen ist unter normalen Umständen nur durch den vorhandenen RAM begrenzt.
 

Kugelfisch

Nerd

Registriert
12 Juli 2013
Beiträge
2.342
Ort
Im Ozean
Korrekt.

Das [kw]new[/kw]-Schlüsselwort alloziert Speicher im Heap für eine Objektinstanz, legt dort eine mit dem angegebenen Konstruktor erzeugte Instanz der Klasse ab, und liefert einen Pointer darauf zurück (daher wäre die korrekte Syntax auch [kw]Foo *f = new Foo(23,42)[/kw], d.h. [kw]f[/kw] ist ein Zeiger auf den Typ [kw]Foo[/kw]). Wichtig ist dabei anzumerken, dass der Speicher auch dann reserviert bleibt, wenn der Pointer nicht mehr existiert (C++ bietet keine Garbage Collection und keine Referenzzähler für Objekte), d.h. wenn das Objekt nicht später explizit mittels des [kw]delete[/kw]-Operators freigegeben wird, wird der Speicher erst freigegeben, wenn das Programm beendet wird (Memory Leak).
Eine Initialisierung eines Objektwerts wie z.B. [kw]Foo f(23,42)[/kw] (oder auch [kw]Foo f[/kw], was zu [kw]Foo f()[/kw] äquivalent ist, d.h. den Konstruktor ohne Parameter aufruft) erzeugt eine Objektinstanz auf dem Stack. Diese wird spätestens automatisch gelöscht, wenn der entsprechende Stack Frame zerstört wird, z.B. am wenn der Funktion zurückgesprungen wird. Übrigens können auch aus anderen Gründen temporär Objektinstanzen auf dem Stack erzeugt werden, etwa wenn eine Methode oder ein überladener Operator eines Objekts ein Objekt als Wert zurückliefert.

Die maximale Stackgrösse ist u.a. abhängig vom Betriebssystem und von der Konfiguration. Unter GNU/Linux wird sie durch das `stack size`-ulimit bestimmt - in aktuellen Distributionen sind Standardwerte zwischen 8 und 10 MiB gebräuchlich. Unter Windows wird sie tatsächlich vom Linker in den PE-Header geschrieben.
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Wichtig ist dabei anzumerken, dass der Speicher auch dann reserviert bleibt, wenn der Pointer nicht mehr existiert (C++ bietet keine Garbage Collection und keine Referenzzähler für Objekte), d.h. wenn das Objekt nicht später explizit mittels des delete-Operators freigegeben wird, wird der Speicher erst freigegeben, wenn das Programm beendet wird (Memory Leak).
Dazu sei ergänzend angemerkt, dass die STL zu diesem Zweck smart pointer bereit stellt, durch welche diese Problematik vermieden wird. Die Deklaration sähe dann z.B. so aus:
[src=cpp]
std::unique_ptr<Wand> w(new Wand);
[/src]
Das sieht auf den ersten Blick vielleicht unnötig kompliziert aus, hat aber den Vorteil, dass der belegte Speicher automatisch freigegeben wird sobald der Zeiger nicht mehr existiert.
 
Oben