Thread View: de.comp.lang.c++
5 messages
5 total messages
Started by Hans-Martin Speiser
Mon, 13 Nov 1995 09:44
Templates in Klassen
Author: Hans-Martin Speiser
Date: Mon, 13 Nov 1995 09:44
Date: Mon, 13 Nov 1995 09:44
54 lines
2230 bytes
2230 bytes
Hallo auch,
ich versuche schon eine Weile unter Borland C++ 4.5 eine template Klasse
in meine eigene Klasse zu integrieren. Dabei habe ich folgendes
Problemchen:
Ich kann die template Klasse nicht initialisieren!!
Um etwas genauer zu sein habe ich eine Klasse "Eimer" angelegt, in der
ich ein Attribut
class Eimer
{
privat
TArrayAsVector<string> inhalt;
public:
Eimer(void);
Add_was(const string& s);
}
definiert habe. In dem Konstruktor zu dieser Klasse wuerde ich gerne den
Array initialisieren, um dann direkt unter "Add_was" einen Befehl wie
inhalt.AddItem(s);
aufrufen zu koennen. (Dabei ist natuerlich "AddItem" in der
Kontainerklasse definiert!)
Und soweit bin ich bisher gekommen:
Definiere ich meine Klasse "Eimer" wie oben dann findet "Borland" in dem
Konstruktor der Klasse keinen default Konstruktor zum initialisieren der
Variable "inhalt".
Fehlermeldung: Cannot find default constructor to initialize member
"inhalt" in function Eimer::Eimer()
Definiere ich in meiner Klasse "Eimer" den "inhalt" so:
"TArrayAsVector<string> inhalt();", dann bekomme ich folgende
Fehlermeldung: Structure required on left side of . or .* in function
Eimer::Add_was(const string &) und zwar in der Zeile von
"inhalt.AddItem(s);". Was mach ich falsch?
Bemerkung 1:
Es gibt fuer TArrayAsVector<T> einen Konstruktor (x), der die Groesse
des Arrays
angibt und einen leeren Array anlegt - schaetze den muss ich irgendwo
verwenden -
der geht aber nicht bei der Definition des Attributs "inhalt" in der
Klasse "Eimer"!
Bemerkung 2:
Ich kann den Konstruktor von Bemerkung 1 wunderbar in einer Funktion
main()
anwenden aber nicht in einem Konstruktor einer Klasse wie ich es will!
Viel Spass :-) und bitte helf mir einer...
Re: Templates in Klassen
Author: Mario Zimmermann
Date: Mon, 13 Nov 1995 15:25
Date: Mon, 13 Nov 1995 15:25
58 lines
1846 bytes
1846 bytes
Hans-Martin Speiser <speiser@eric.u-strasbg.fr> wrote:
>Hallo auch,
Hallo Hans,
>
>ich versuche schon eine Weile unter Borland C++ 4.5 eine template Klasse
>in meine eigene Klasse zu integrieren. Dabei habe ich folgendes
>Problemchen:
>Ich kann die template Klasse nicht initialisieren!!
>Um etwas genauer zu sein habe ich eine Klasse "Eimer" angelegt, in der
>ich ein Attribut
>
>class Eimer
>{
> privat
> TArrayAsVector<string> inhalt;
>
> public:
> Eimer(void);
> Add_was(const string& s);
Versuch's mal mit einem Pointer und mit der empfohlenen Methode,
den Typ des Arrays vorher zu deklarieren, also:
typedef TArrayAsVector<string> TMyEimerArray;
class Eimer
{
private:
TMyEimerArray *inhalt;
Im Konstruktor wird dann das Array initialisiert:
inhalt = new TMyEimerArray (10, 0, 10);
..und mit Werten gefuellt:
inhalt->Add (....);
Vergiss nicht, das Array im Destruktor wieder zu loeschen!!
Hoffe geholfen zu haben,
-----
Mario
--
# # ## # # LION Gesellschaft fuer Systementwicklung mbH
# # # # ## # Mario Zimmermann email: zimmerma@lion.de
# # # # # ## Universitaetsstr. 140 Phone: +49 (0)234 9709-315
#### # ## # # D-44799 Bochum Fax: +49 (0)234 9709-111
Re: Templates in Klassen
Author: Karl-Heinz Krause
Date: Tue, 14 Nov 1995 06:38
Date: Tue, 14 Nov 1995 06:38
65 lines
2741 bytes
2741 bytes
Am 13. Nov. 1995 schrieb Hans-Martin Speiser
(speiser@eric.u-strasbg.fr>):
> Hallo auch,
> ich versuche schon eine Weile unter Borland C++ 4.5 eine template Klasse
> in meine eigene Klasse zu integrieren. Dabei habe ich folgendes
> Problemchen:
> Ich kann die template Klasse nicht initialisieren!!
> Um etwas genauer zu sein habe ich eine Klasse "Eimer" angelegt, in der
> ich ein Attribut
> class Eimer
> {
> privat
> TArrayAsVector<string> inhalt;
> public:
> Eimer(void);
> Add_was(const string& s);
> }
> definiert habe. In dem Konstruktor zu dieser Klasse wuerde ich gerne den
> Array initialisieren, um dann direkt unter "Add_was" einen Befehl wie
> inhalt.AddItem(s);
> aufrufen zu koennen. (Dabei ist natuerlich "AddItem" in der
> Kontainerklasse definiert!)
> Und soweit bin ich bisher gekommen:
> Definiere ich meine Klasse "Eimer" wie oben dann findet "Borland" in dem
> Konstruktor der Klasse keinen default Konstruktor zum initialisieren der
> Variable "inhalt".
> Fehlermeldung: Cannot find default constructor to initialize member
> "inhalt" in function Eimer::Eimer()
>
> Definiere ich in meiner Klasse "Eimer" den "inhalt" so:
> "TArrayAsVector<string> inhalt();", dann bekomme ich folgende
> Fehlermeldung: Structure required on left side of . or .* in function
> Eimer::Add_was(const string &) und zwar in der Zeile von
> "inhalt.AddItem(s);". Was mach ich falsch?
Wenn man es so macht, dann ist "inhalt" eine Funktion und man kann
natürlich nicht "inhalt.AddItem(s)" schreiben.
> Bemerkung 1:
> Es gibt fuer TArrayAsVector<T> einen Konstruktor (x), der die Groesse
> des Arrays angibt und einen leeren Array anlegt - schaetze den muss ich
> irgendwo verwenden - der geht aber nicht bei der Definition des Attributs
> "inhalt" in der Klasse "Eimer"!
> Bemerkung 2:
> Ich kann den Konstruktor von Bemerkung 1 wunderbar in einer Funktion
> main() anwenden aber nicht in einem Konstruktor einer Klasse wie ich es will!
Der Konstruktor einer Membervariablen muß in der Definition des
Konstruktors für die Klasse aufgerufen werden. Etwa so:
Eimer::Eimer(): inhalt(10) {}
Karl-Heinz Krause
Re: Templates in Klassen
Author: Karl-Heinz Krause
Date: Wed, 15 Nov 1995 16:25
Date: Wed, 15 Nov 1995 16:25
32 lines
1538 bytes
1538 bytes
Am 13. Nov 1995 schrieb Mario Zimmermann (zimmerma@lion.de):
> Versuch's mal mit einem Pointer und mit der empfohlenen Methode,
> den Typ des Arrays vorher zu deklarieren, also:
> typedef TArrayAsVector<string> TMyEimerArray;
Wer "empfiehlt" sowas? Das hat überhaupt nichts mit dem Problem von
Hans-Martin Speiser zu tun.
> class Eimer
> {
> private:
> TMyEimerArray *inhalt;
> Im Konstruktor wird dann das Array initialisiert:
> inhalt new TMyEimerArray (10, 0, 10);
Diese Indirektion (inhalt als Zeiger auf Array statt direkt als Array zu
definieren) ist hier unnötig, und unnötige Indirektionen sollte man
vermeiden. (Geht letztlich immer zu Lasten der Programmeffizienz.)
Das Problem von Hans-Martin Speiser war doch einfach, daß er nicht
wußte, wie man in einem Konstruktor für eine Klasse den Konstruktor
einer Membervariablen aufruft. Durch den Umweg über Zeiger umgehst Du
das (jetzt erfolgt die Initialisierung von inhalt durch einen Aufruf von
new). Aber warum Umweg, wenn es auch direkt geht?
Karl-Heinz Krause
Re: Templates in Klassen
Author: Andreas Koenig
Date: Fri, 17 Nov 1995 16:27
Date: Fri, 17 Nov 1995 16:27
41 lines
1546 bytes
1546 bytes
In article <48741g$24k@apopi.u-strasbg.fr>, Hans-Martin Speiser <speiser@eric.u-strasbg.fr> writes:
> Hallo auch,
>
> ich versuche schon eine Weile unter Borland C++ 4.5 eine template Klasse
> in meine eigene Klasse zu integrieren. Dabei habe ich folgendes
> Problemchen:
> Ich kann die template Klasse nicht initialisieren!!
> Um etwas genauer zu sein habe ich eine Klasse "Eimer" angelegt, in der
> ich ein Attribut
>
> class Eimer
> {
> privat
> TArrayAsVector<string> inhalt;
>
> public:
> Eimer(void);
> Add_was(const string& s);
> }
>
> definiert habe. In dem Konstruktor zu dieser Klasse wuerde ich gerne den
> Array initialisieren, um dann direkt unter "Add_was" einen Befehl wie
>
> inhalt.AddItem(s);
>
> aufrufen zu koennen. (Dabei ist natuerlich "AddItem" in der
> Kontainerklasse definiert!)
> ...
Versuch doch mal, beim Konstruktor von Eimer auch den Konstruktor von
TArryAsVector mitaufzurufen, also:
Eimer::Eimer() : inhalt(laenge_des_array)
{
...
}
Eigentlich sollte es dann funktionieren.
MfG
AK
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads