Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Template Klasse instanzieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.07.2005, 09:34 Uhr
blackbox



Hallo

Ich möchte in einer Klasse den Typen einer Objektvariabel (m_oServer) erst im Konstruktor bestimmen. Ist das möglich? So wie ich es mit dem Template wollte, funktioniert das nicht.

########### CClassA.h ##################################
...
...

C++:
#include "CSerialServer.h"
#include "CTcpIpServer.h"
#include "CModemServer.h"

class CClassA  
{
private:
    template <typename T>
    T* m_oServer;
public:
        CClassA(int A);
    CClassA(int A, int B);
    CClassA(int A, int B, int C);
    virtual ~CClassA();
};



########### CClassA.cpp ##################################

C++:
CClassA::CClassA(int A)
{
    m_oServer = new CSerialServer(A);
    m_oServer->Connect();
}

// Constructor for tcpip connection
CClassA::CClassA(int A, int B)
{
    m_oServer = new CTcpIpServer(A, B)
    m_oServer->Connect();
}

// Constructor for modem connection
CClassA::CClassA(int A, int B, int C)
{
    m_oServer = new CModemServer(A, B, C);
    m_oServer->Connect();
}

CClassA::~CClassA()
{
    m_oServer->Disconnect();
    delete m_oServer;
}

##########################################################
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.07.2005, 10:37 Uhr
Th



Template gibt es nur bei Klassen oder Methoden bzw. Funktionen, d.h. entweder die Klasse mit dem template-Parameter versehen oder eine Zugriffsmethode schreiben, welche den richtigen Typen zurückliefert, aber eine Membervariable kann immer nur ein bestimmter Typ sein.

Wenn die einzelnen Server-Klassen (Serial, TcpIp, Modem) von einer Basisklasse abgeleitet sind, dann nimm diese Basisklasse als Membervariable und benutze virtuelle Methoden für den Zugriff. (dies ist der beste Ansatz hierfür!)

Dieser Post wurde am 29.07.2005 um 10:40 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.07.2005, 10:52 Uhr
blackbox



Ja, das klappt so mit der Baseclass und den virtuellen Methoden...danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.07.2005, 14:39 Uhr
blackbox



Hallo nochmals,

Wenn ich das so mit den virtuellen Methoden mache, kann ich jedoch immer nur auf Methoden der Base-Class zugreiffen??

Base-Class

C++:
class CConnectionServer  
{
public:
        CConnectionServer();
    virtual ~CConnectionServer();
    virtual bool Connect( );
};




C++:
class CSerialServer : public CConnectionServer  
{
public:
    CSerialServer(_bstr_t szParam);
    virtual ~CSerialServer();
    bool Connect(_bstr_t szConParam);
};



Wenn ich nun in einer anderen Klasse eine Instanz von CSerialServer haben möchte, habe ich das folgendermassen angestellt:

C++:
class CUsage  
{
private:
    CConnectionServer* m_oServer;  // als Klasse die Base Class CConnectionServer
                                                     // Instanzierung: m_oServer=new CSerialServer(L"parameter");
public:
    CUsage(_bstr_t szParam);          // Konstruktor für serielle Verbindung
};


// Konstruktor für Serielle Verbindung der Klasse CUsage
CUsage::CUsage(_bstr_t szParam)
{
    m_oServer = new CSerialServer(szParam);
    m_oServer->Connect();             // FEHLER: Connect() von CConnectionServer
                                                     // wird ausgeführt
}



Mein Problem ist, dass ich erst im Konstruktor von CUsage entscheiden möchte, welche Klasse (CSerialServer, CTcpIpServer od. CModemServer) ich instanzieren möchte?? Gibt es für das evtl. noch eine schlauere Lösung?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.07.2005, 14:47 Uhr
Tommix



Hallo,
mit

C++:
bool Connect(_bstr_t szConParam);


hast Du

C++:
virtual bool Connect( );


überdeckt. Wenn Du sie überschreiben willst, muß die Signatur (in diesem Fall die Parameterliste) gleich sein. Das ist hier schön beschrieben.

Gruß, Tommix

--
12

Dieser Post wurde am 29.07.2005 um 14:48 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.07.2005, 14:58 Uhr
blackbox



Das Problem ist aber, dass ich in jeder Klasse (CSerialServer, CTcpIpServer, CModemServer) eine Funktion Connect() habe mit immer unterschiedlichen Parametern? Dann muss ich die Funktion ja zwangsweise überdecken??

Oder definiere ich das so falsch?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.07.2005, 15:09 Uhr
Tommix



Die Idee einer virtuellen Funktion ist ja gerade, daß sie nach außen immer das gleiche Interface bietet, obwohl die Implementierung in den abgeleiteten Klassen unterschiedlich sein kann. Du müßtest dann alle Parameter-Varianten in der Basisklasse haben. Aber unter Umständen ist auch die Klassenhierarchie ungünstig gewählt. Manchmal ist es besser, die Funtionalität der Basisklasse in eine separate Klasse zu verlagern und diese dann zum Member der einzelnen Unterklassen zu machen. Oder Du implementierst Connect für jede Klasse einzeln, also nicht virtuell in der Basisklasse.

- Tommix

--
11
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
31.07.2005, 13:09 Uhr
~Blackbox
Gast


Hallo Tommix

Könntest du mir ein kurzes Beispiel machen, wie das Problem gelöst werden könnte? Ich bekomme das so nicht gebacken? Das mit der Deklaration aller Parameter-Varianten funktioniert zwar, finde ich aber nicht sehr schön und sinnvoll.

Danke Blackbox
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: