Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 05:06

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Klassenvererbung mit einer Klasse in einer Klasse.

Discussion on Klassenvererbung mit einer Klasse in einer Klasse. within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
EXTEЯNAL's Avatar
 
elite*gold: 105
Join Date: Jul 2007
Posts: 737
Received Thanks: 114
Klassenvererbung mit einer Klasse in einer Klasse.

Moin, habe mal kurz eine Frage, ich versuche grad folgendes zu Realisieren:

MeinKlasse->Auto.Reifen()

Im Konstruktor von MeineKlasse() wird folgendes zugewiesen: m_iSeriennummer.

Ich würde gerne in der Auto.Reifen funktion auf dieser Variable zugreifen können, leider weiß ich nicht wie, ich will keine Zweite Variable extra im Auto Konstruktor dafür anlegen, dass muss auch ohne zweiter Variable klappen (hoffe ich).

So stelle ich mir das ganze ungefähr vor, funktioniert aber natürlich nicht, ich weiß nicht wie ich es sonst beschreiben soll, hoffe ihr versteht mein Problem ...

PHP Code:
class CAuto
{
public:
    class 
cAuto
    
{
    public:
        
int Reifen()
        {
            
// Code ...
            
return this->m_iSeriennummer;
        }
    } 
Auto;
};

class 
CMeinKlasse : public CAuto
{
public:
    
CMeineKlasse() : m_iSeriennummer(Seriennummer) { }
private:
    
int m_iSeriennummer;
    
// ...
}; 
EXTEЯNAL is offline  
Old 05/25/2013, 02:49   #2

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,480
Received Thanks: 3,319
Code:
class CAuto
{

	int m_iSeriennummer;
public:

	CAuto(int Seriennummer = 0) : m_iSeriennummer(Seriennummer) { };

	int Reifen()
	{
		return this->m_iSeriennummer;
	};

};

class CMeineKlasse : public CAuto
{

public:
	CMeineKlasse(int Seriennummer = 0) : CAuto(Seriennummer) { };
};
Das sollte passen. Du erbst ja die Eigenschaften von CAuto, CAuto weiß aber nichts von CMeineKlasse, darum brauchst du die Variable in der CAuto-Klasse. Im Konstruktor wird dann einfach der Konstruktor von CAuto aufgerufen und da der Wert gespeichert.
snow is offline  
Old 05/25/2013, 02:58   #3
 
EXTEЯNAL's Avatar
 
elite*gold: 105
Join Date: Jul 2007
Posts: 737
Received Thanks: 114
Ja, dann würde der Aufruf wie folgt aussehen:

CMeineKlasse->Reifen(), dass sollte aber Spererat in einer zweiten Klasse sein, ich möchte nämlich eine DirectX Klasse erstellen.

DirectX->CreateDevice() etc pp ....

Dort in dieser Klasse will ich dann den Device Pointer (DirectX Klasse) als Member speichern, ebenfalls möchte ich in der DirectX Klasse eine zweite Draw Klasse haben die ich wie folgt aufrufe:

DirectX->Draw.Line(...)

Jede Funktion in der Draw Klasse benötigt diesen Device Pointer um überhaupt zu zeichnen.

Gruß
EXTEЯNAL is offline  
Old 05/25/2013, 03:25   #4

 
マルコ's Avatar
 
elite*gold: 1329
Join Date: Jun 2009
Posts: 1,873
Received Thanks: 960
Dann mach 2 Klassen und in der einen Klasse speicherst du ein Objekt der 2. Klasse. per Getter kannst das dann verwenden...


Code:
class CFoo
{
public:

  void doSumthin();
  // ...


};
Code:
class CBar
{
public:

  CFoo getFoo() { return pFoo; }
  // ...


private:

  CFoo pFoo;


};
Code:
void main()
{

  // ...

  std::unique_ptr<CBar> pBar(new CBar());  // Smart Pointer for easy memory management ;P
  // ...

  pBar->getFoo().doSumthin();
  //...

}
マルコ is offline  
Thanks
1 User
Old 05/25/2013, 03:33   #5
 
EXTEЯNAL's Avatar
 
elite*gold: 105
Join Date: Jul 2007
Posts: 737
Received Thanks: 114
PHP Code:
class CDraw
{
public:
    
CDraw(int iDevice) : m_iDevice(iDevice) {}
    ~
CDraw() {}
    
void Line() {}
    
void Box() {}
    
void Text() {}
    
void Circle() {}
private:
    
int m_iDevice;
};

class 
CDirectX
{
public:
    
CDirectX(int iDevice) : m_iDevice(iDevice), Draw(iDevice) {}
    ~
CDirectX() {}
    
CDraw Draw;
private:
    
int m_iDevice;
protected:

};

int main()
{
    
CDirectX *Dx = new CDirectX(1337);
    
Dx->Draw.Box();
    
delete Dx;
    
getchar();
    return 
1;

Habs nun so, kann man da noch iwas optimieren oder ist dort alles im Grünen Bereich?

Wird der reservierte Speicher der Klasse Box (In CDirectX -> CDraw Draw) eigentlich beim löschen des DirectX Objektes auch gelöscht bzw freigegeben? oder muss ich hier manuell Hand anlegen?
EXTEЯNAL is offline  
Old 05/25/2013, 03:40   #6

 
マルコ's Avatar
 
elite*gold: 1329
Join Date: Jun 2009
Posts: 1,873
Received Thanks: 960
Variablen niemals als Public setzen. Das hat verschiedene Gründe.

Hier ein paar Beispiele:
Quote:
There are actually many good reasons to consider using accessors rather than directly exposing fields of a class - beyond just the argument of encapsulation and making future changes easier.

Here are the some of the reasons I am aware of:

Encapsulation of behavior associated with getting or setting the property - this allows additional functionality (like validation) to be added more easily later.
Hiding the internal representation of the property while exposing a property using an alternative representation.
Insulating your public interface from change - allowing the public interface to remain constant while the implementation changes without effecting existing consumers.
Controlling the lifetime and memory management (disposal) semantics of the property - particularly important in non-managed memory environments (like C++ or Objective-C).
Providing a debugging interception point for when a property changes at runtime - debugging when and where a property changed to a particular value can be quite difficult without this in some languages.
Improved interoperability with libraries that are designed to operate against property getter/setters - Mocking, Serialization, and WPF come to mind.
Allowing inheritors to change the semantics of how the property behaves and is exposed by overriding the getter/setter methods.
Allowing the getter/setter to be passed around as lambda expressions rather than values.
Getters and setters can allow different access levels - for example the get may be public, but the set could be protected.
von
マルコ is offline  
Old 05/25/2013, 03:46   #7
 
EXTEЯNAL's Avatar
 
elite*gold: 105
Join Date: Jul 2007
Posts: 737
Received Thanks: 114
Stimmt schon, kenne diese Regel auch, habe es jetzt nicht bei der Klasse beachtet, dachte es wäre erlaubt für klassen, hab wohl was durcheinander geworfen, danke für den Hinweis, dass mit den Gettern und Settern kenne ich auch.

PHP Code:
int zahl;
int GetZahl() { return zahl // Gleiches gillt für SetZahl. 
Wie sollte ich das denn für die Klasse benutzen?

PHP Code:
class CDraw
{
public:
    
CDraw(int iDevice) : m_iDevice(iDevice) {}
    ~
CDraw() {}
    
void Line() {}
    
void Box() {}
    
void Text() {}
    
void Circle() {}
private:
    
int m_iDevice;
};

class 
CDirectX
{
public:
    
CDirectX(int iDevice) : m_iDevice(iDevice), m_CDraw(iDevice) {}
    ~
CDirectX() {}
    
CDraw Draw() { return m_CDraw; }

private:
    
CDraw m_CDraw;
    
int m_iDevice;
protected:

};

int main()
{
    
CDirectX *Dx = new CDirectX(1337);
    
Dx->Draw().Line();
    
getchar();
    return 
1;

Sollte so meines Wissen nach richtig sein, falls nicht bitte drauf aufmerksam machen.

Zurück zur Frage, wie sieht es mit der Speicherbereining aus wenn ich die Hauptklasse CDirectX lösche, wird der reservierte speicher für m_CDraw und Draw auch gelöscht?
EXTEЯNAL is offline  
Old 05/25/2013, 03:50   #8

 
マルコ's Avatar
 
elite*gold: 1329
Join Date: Jun 2009
Posts: 1,873
Received Thanks: 960
Wenn es ein Object ist, wird es beim "Sterben" des Elternobjects auch vernichtet. Wenn es ein Pointer ist, entsteht ein Memory Leak. Du musst Pointer immer freigeben - dazu nimmt man z.B. den Destruktor - oder Smart Pointers^^
マルコ is offline  
Old 05/25/2013, 03:53   #9
 
EXTEЯNAL's Avatar
 
elite*gold: 105
Join Date: Jul 2007
Posts: 737
Received Thanks: 114
Also so wie ich es gelernt habe, sollte man ein Pointer mit delete löschen, sollte eigentlich reichen oder? ^^

Klasse *klasse = new Klasse()
delete klasse; // ruft den Destruktor auf? im right?
EXTEЯNAL is offline  
Old 05/25/2013, 04:21   #10

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,480
Received Thanks: 3,319
Schau dir mal Smart Pointer an, die übernehmen das für dich & du musst dicht mehr um delete kümmern. Beim unique_ptr kann nur der unique_ptr auf das Objekt zeigen, beim shared_ptr läuft das ganze über Reference Counting und mehrere Zeiger können auf das selbe Objekt zeigen.
Bei beiden Smart Pointer Typen wird am Ende des Gültigkeitsbereichs bzw. wenn es keine Referenzen mehr auf den Speicher gibt, der Speicher freigegeben.
Was machst du bei delete, wenn vorher eine Exception die Funktion terminiert?

Und ja, delete klasse dürfte den Destruktor aufrufen.
snow is offline  
Old 05/25/2013, 13:21   #11
 
Hiris's Avatar
 
elite*gold: 99
Join Date: Apr 2011
Posts: 730
Received Thanks: 236
Warum das Object überhaupt dynamisch im Heap / mit Pointer erstellen? Ist in dem Zusammenhang doch absolut unnötig. Wenn das Objekt nicht dynamisch erstellt wurde wird es automatisch destruktoriert (wenn es das wort gibt :/ ) wenn es den gültigkeits bereich verlässt, also alles easy peasy...
Hiris is offline  
Old 05/25/2013, 13:38   #12
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Zerstört?

Padmak
Padmak is offline  
Old 05/25/2013, 13:44   #13
 
Hiris's Avatar
 
elite*gold: 99
Join Date: Apr 2011
Posts: 730
Received Thanks: 236
Quote:
Originally Posted by Padmak View Post
Zerstört?

Padmak
destruktoriert hört sich besser an
Hiris is offline  
Old 05/25/2013, 16:14   #14
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Wie schon gesagt wurde, ist es hier nicht nötig, das Objekt dynamisch zu erzeugen.
Einfach mal als Daumenregel: Wann immer es möglich ist sollten Objekte auf den Stack angelegt werden.
Falls man dennoch ein dynamisch erzeugtes Objekt braucht: RAII.
Schlüsselbein is offline  
Old 05/25/2013, 16:47   #15
 
LcPlayer1's Avatar
 
elite*gold: 1765
Join Date: Aug 2011
Posts: 2,538
Received Thanks: 400
Du solltest noch etwas auf die Coding Conventions achten. Funktionen beginnen in der Regel mit einem kleinen Buchstaben.
LcPlayer1 is offline  
Reply


Similar Threads Similar Threads
Objekte[n] von einer Klasse erstellen
08/23/2012 - C/C++ - 32 Replies
// Hat sich erledigt... Paar Fehler habe ich gleich mitbehoben.
C++ / Array in einer Klasse
06/21/2012 - C/C++ - 9 Replies
Hi Leute! Ich erstelle das Objekt "ElevatorControl" genau einmal. Zu einem späteren Zeitpunkt erstelle ich ein oder mehrere Objekte von "ElevatorCabin" und möchte die Adressen von "ElevatorCabin" in dem Array "elevators","elevators", usw. speichern. Leider habe ich eine totale Denkblockade und komme einfach nicht drauf wie ich dass hinbekommen soll. Ich hoffe jemand von euch kann mir helfen. //ElevatorControl.h class ElevatorControl { public: void requestUpward(int atLevel); void...
Einer aus meiner klasse
03/24/2011 - CrossFire - 14 Replies
YouTube - Bruno Mars - Grenade Acoustic Live Cover by Ardijan and Jérémy schaut euch das mal an das ist einer aus meiner klasse was der drauf hat OMG und DSDS hat NEIN gesagt schau es euch an und macht deumen hoch nicht nicht zu vergessen komentar MFG ae
[C++] Vraiblen einer KLasse in die Funktion einer anderen einfügen
03/14/2011 - C/C++ - 10 Replies
Hallo Leute, Ich habe mal wieder eine Frage :D Ich bin gerade dabei ein kleines Spiel(noch ist es klein ;D) zu programmieren. Dabei bin ich auf das Problem gestoßen, dass ich gerne die Verteidigung der "User" Class in eine Berechnung(Funktion) einer "Npc" Class einbinden würde. Dies funktioniert aber weder durch: -Einführen einer Funktion in der User class die eine Variable returned die den selben Wert besitzt, wie die Variable der Verteidigung in der Userclass -Direktes Aufrufen der...
[C++]Funktion einer Klasse in einer anderen Funktion der Klasse verwenden, aber wie?
07/25/2010 - C/C++ - 3 Replies
Mein Problem ist eigentlich recht simpel und die Lösung wahrscheinlich auch. Da ich bisher fast 0 mit Klassen am Hut hatte, wollte ich mich doch mit dem Thema anfreunden und hatte gleich angefangen: int test::Funktion2() { int temp; cin>>temp; return temp; }



All times are GMT +2. The time now is 05:06.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.