Templateklassen in Konstruktor initialiseren

Hi

Bei einem bestehenden Programm möchte ich Arrays von Templateklassen in einem Klassenkonstruktor initialiseren. Die zu initialisierenden Klassen verfügen über keine programmierten Set, Get Methoden und haben auch kein überladenen Zuweisungsoperator. Die bestehenden Templateklassen können/dürfen auch nicht abgeändert weden.

Das Ganze sieht ungefähr so aus:

template 
class BaseT
{
 public:
 BaseT( int pIni ){ // ... }
 virtual ~BaseT( ){ // ... }
 // ...
};

class BasesC
{
 public:
 BasesC( int Ini ) :
 // Wie initialisiere ich hier jedes einzelne Objekt im Objektarray?

 BaseT BasesL[3];
 BaseT BasesLL[3];
 // ...
};

Das kenne ich bereits, hilft mir aber nicht weiter. Oder doch …?

class Bsp
{
 public:
 Bsp( int i ){ //... }
 // ...
};

int main()
{
 class Bsp dieBsps[3] = { Bsp( 1 ), Bsp( 2 ), Bsp( 3 ) };
 return 0;
}

Wer kann mir weiterhelfen?

Gruss, Olli

Also,
Ganze Arrays kannst du so ohne Weiteres nicht initialisieren, weil dafür ein Standartkonstruktor nötig wäre, denn die Element werden erzeugt, BEVOR der {}-Block vom Konstruktor der "Sammel-"klasse aufgerufen wird…
Mit einzlnen Elementen geht das aber:

template
class Klassenklown
{
public:
Klassenklown(T Teil) {Element = Teil;};

private:
T Element;
};

class Klownkiller
{
public:
Klownkiller(float Wert);

private:
Klassenklown m_Klown;
};

Klownkiller::Klownkiller(float Wert):
m_Klown(Wert) // [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Fragender Frosch … quack … :wink:

Erst mal vielen Dank für deine Antwort. Genau so verwende ich die Templateklassen zur Zeit. Ich verwende g++ version 3.2.3 20030502 (Red Hat Linux 3.2.3-20) und da müssen die Tempaltes sogar in der gleichen Reihenfolge initialisert werden wie sie deklariert wurden, sonst erscheint eine Warnung. Die kann allerdings auch mit _ -Wno-reorder _ ausgeblendet werden.

Die Templateklassen sind übrigens eine Schnittstelle zu einer Datenbank (Column, Column, Column etc. ). Die Datenbank hat Tabellen die etwa so aussehen:

CREATE TABLE t\_check\_id
(
 pk VARCHAR2 (50)
 , fk\_checks VARCHAR2 (50)
 , checkid\_1 VARCHAR2 (20)
 , checkid\_2 VARCHAR2 (20)
 , checkid\_3 VARCHAR2 (20)
 , checkid\_4 VARCHAR2 (20)
 , checkid\_5 VARCHAR2 (20)
 , checkid\_6 VARCHAR2 (20)
 , checkid\_7 VARCHAR2 (20)
 , checkid\_8 VARCHAR2 (20)
 , checkid\_9 VARCHAR2 (20)
 , checkid\_10 VARCHAR2 (20)
 , checkid\_11 VARCHAR2 (20)
 , checkid\_12 VARCHAR2 (20)
 , checkid\_13 VARCHAR2 (20)
 , checkid\_14 VARCHAR2 (20)
 , checkid\_15 VARCHAR2 (20)
 , checkid\_16 VARCHAR2 (20)
 , checkid\_17 VARCHAR2 (20)
 , checkid\_18 VARCHAR2 (20)
 , checkid\_19 VARCHAR2 (20)
 , checkid\_20 VARCHAR2 (20)
 , checkid\_21 VARCHAR2 (20)
 , checkid\_22 VARCHAR2 (20)
 , checkid\_23 VARCHAR2 (20)
 , checkid\_24 VARCHAR2 (20)
);

Anstelle von …

class DbCheckId {
 public:
 class DbCheckId();
 virtual ~class DbCheckId();

 Column mCheckId1;
 Column mCheckId2;
 Column mCheckId3;
 ...
 Column mCheckId24;
};

DbCheckId::smiley:bCheckId():
 mCheckId1( TABLENAME, TABLE\_SPACE\_OWNER, "checkid\_1", eString, LENa ),
 mCheckId2( TABLENAME, TABLE\_SPACE\_OWNER, "checkid\_2", eString, LENa ),
 ...
 mCheckId24( TABLENAME, TABLE\_SPACE\_OWNER, "checkid\_24", eString, LENa )
{
}

… wäre folgendes viel praktischer zu handhaben.

class DbCheckId {
 public:
 class DbCheckId();
 virtual ~class DbCheckId();

 static const int mIdLen = 24;
 Column mCheckId[mId];
};

DbCheckId::smiley:bCheckId():
 // ... und jetzt ... ???
{
}

Aber wie initialisere ich jetzt die Templates?

Gruss, Olli

PS: Ich trage keine Verantwortung was das DB-Design betrifft und ich habe auch keine Möglichkeit es zu Ändern.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

PS: da hat sich doch ein Fehler eingeschlichen:

**falsch**
 static const int mIdLen = 24;
 Column mCheckId[**mId**];
};
**richtig**
 static const int mIdLen = 24;
 Column mCheckId[**mIdLen**];
};

Und noch eine Präzisierung meiner Frage:
Ist es möglich ein einzelnes Element aus dem Array im Kunstruktor zu initialisieren? Wenn ja, wie sieht die Syntax dafür aus? Wenn nein, welche anderen Möglichkeiten gibt es?

Vielen Dank für die Hilfe.
Gruss, Olli

Hallo Fragender Frosch … quack … :wink:

Erst mal vielen Dank für deine Antwort. Genau so verwende ich
die Templateklassen zur Zeit. Ich verwende g++ version 3.2.3
20030502 (Red Hat Linux 3.2.3-20) und da müssen die Tempaltes
sogar in der gleichen Reihenfolge initialisert werden wie sie
deklariert wurden, sonst erscheint eine Warnung. Die kann
allerdings auch mit _ -Wno-reorder _ ausgeblendet
werden.

Die Templateklassen sind übrigens eine Schnittstelle zu einer
Datenbank (Column, Column,
Column etc. ). Die Datenbank hat Tabellen die
etwa so aussehen:

CREATE TABLE t_check_id
(
pk VARCHAR2 (50)
, fk_checks VARCHAR2 (50)
, checkid_1 VARCHAR2 (20)
, checkid_2 VARCHAR2 (20)
, checkid_3 VARCHAR2 (20)
, checkid_4 VARCHAR2 (20)
, checkid_5 VARCHAR2 (20)
, checkid_6 VARCHAR2 (20)
, checkid_7 VARCHAR2 (20)
, checkid_8 VARCHAR2 (20)
, checkid_9 VARCHAR2 (20)
, checkid_10 VARCHAR2 (20)
, checkid_11 VARCHAR2 (20)
, checkid_12 VARCHAR2 (20)
, checkid_13 VARCHAR2 (20)
, checkid_14 VARCHAR2 (20)
, checkid_15 VARCHAR2 (20)
, checkid_16 VARCHAR2 (20)
, checkid_17 VARCHAR2 (20)
, checkid_18 VARCHAR2 (20)
, checkid_19 VARCHAR2 (20)
, checkid_20 VARCHAR2 (20)
, checkid_21 VARCHAR2 (20)
, checkid_22 VARCHAR2 (20)
, checkid_23 VARCHAR2 (20)
, checkid_24 VARCHAR2 (20)
);

Anstelle von …

class DbCheckId {
public:
class DbCheckId();
virtual ~class DbCheckId();

Column mCheckId1;
Column mCheckId2;
Column mCheckId3;

Column mCheckId24;
};

DbCheckId::smiley:bCheckId():
mCheckId1( TABLENAME, TABLE_SPACE_OWNER, „checkid_1“,
eString, LENa ),
mCheckId2( TABLENAME, TABLE_SPACE_OWNER, „checkid_2“,
eString, LENa ),

mCheckId24( TABLENAME, TABLE_SPACE_OWNER, „checkid_24“,
eString, LENa )
{
}

… wäre folgendes viel praktischer zu handhaben.

class DbCheckId {
public:
class DbCheckId();
virtual ~class DbCheckId();

static const int mIdLen = 24;
Column mCheckId[mId];
};

DbCheckId::smiley:bCheckId():
// … und jetzt … ???
{
}

Aber wie initialisere ich jetzt die Templates?

Gruss, Olli

PS: Ich trage keine Verantwortung was das DB-Design betrifft
und ich habe auch keine Möglichkeit es zu Ändern.

Hi

Bei einem bestehenden Programm möchte ich Arrays von
Templateklassen in einem Klassenkonstruktor initialiseren. Die
zu initialisierenden Klassen verfügen über keine
programmierten Set, Get Methoden und haben auch kein
überladenen Zuweisungsoperator. Die bestehenden
Templateklassen können/dürfen auch nicht abgeändert weden.

Das Ganze sieht ungefähr so aus:

template
class BaseT
{
public:
BaseT( int pIni ){ // … }
virtual ~BaseT( ){ // … }
// …
};

class BasesC
{
public:
BasesC( int Ini ) :
// Wie initialisiere ich hier jedes einzelne Objekt
im Objektarray?

BaseT BasesL[3];
BaseT BasesLL[3];
// …
};

Das kenne ich bereits, hilft mir aber nicht weiter. Oder doch
…?

class Bsp
{
public:
Bsp( int i ){ //… }
// …
};

int main()
{
class Bsp dieBsps[3] = { Bsp( 1 ), Bsp( 2 ), Bsp( 3 ) };
return 0;
}

Wer kann mir weiterhelfen?

Gruss, Olli

Also,
Ganze Arrays kannst du so ohne Weiteres nicht initialisieren,
weil dafür ein Standartkonstruktor nötig wäre, denn die
Element werden erzeugt, BEVOR der {}-Block vom Konstruktor der
"Sammel-"klasse aufgerufen wird…
Mit einzlnen Elementen geht das aber:

template
class Klassenklown
{
public:
Klassenklown(T Teil) {Element = Teil;};

private:
T Element;
};

class Klownkiller
{
public:
Klownkiller(float Wert);

private:
Klassenklown m_Klown;
};

Klownkiller::Klownkiller(float Wert):
m_Klown(Wert) //

Eine Möglichkeit wäre, das auf dem Heap zu machen:

template 
class Klassenklown
{
public:
 Klassenklown(T Teil) {Element = Teil;};

private:
 T Element;
};


class Klownsammlung
{
public:
 Klownsammlung(float Wert);

private:
 Klassenklown\* mpp\_Klowns[3];
 int Anzahl;
};

Klownsammlung::Klownsammlung(float Wert)
{
 for (int i = 0; i (Wert);
 }
 // Das Objekt wäre dann \*(mpp\_Klowns[0])
}

Ja, klar. Danke für deine Hilfe.

Gruss, Olli

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]