g++ spinnt?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Erdbeer-Schorsch
Beiträge: 219
Registriert: 31.07.2003 23:59:34
Kontaktdaten:

g++ spinnt?

Beitrag von Erdbeer-Schorsch » 11.07.2004 15:06:18

Hi,

ich habe ein aktuelles Debian SID und versuche grade ein kleines C++ Programm zu kompilieren. Dabei wird mir dauernd diese Fehlermeldung um die Ohren gehauen:

IntArray.cpp: In constructor `IntArray::IntArray(int*, int)':
IntArray.cpp:56: error: declaration of `anzahl' shadows a parameter
Die Funktion dazu:

Code: Alles auswählen

IntArray::IntArray(int * a,  int anzahl){
	
	IntArray(anzahl); /* Zeile 56 */
	
	for(int i = 0; i < this -> GetAnz(); i++)
	{
		(*this)[i+1] = a[i];
	}
}
Ich bin nun etwas verunsichert. Kann mir bitte einer bestätigen das ich nix Falsch mache?

Danke

Schorsch
( 0x2b || !0x2b )

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 11.07.2004 15:41:28

Welche g++ Version? SID kann da 3 oder 4 unterschiedliche installieren...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Benutzeravatar
Erdbeer-Schorsch
Beiträge: 219
Registriert: 31.07.2003 23:59:34
Kontaktdaten:

Beitrag von Erdbeer-Schorsch » 11.07.2004 16:08:31

Hi!

Version 3.3.4

Das Problem hat sich gerade erledigt:

So bekomme ich den Fehler,
g++ -o proggie TestIntArray.cpp IntArray.cpp

so aber nicht:
g++ -o proggie IntArray.cpp TestIntArray.cpp

Gruß

Schorsch
Zuletzt geändert von Erdbeer-Schorsch am 11.07.2004 16:11:29, insgesamt 1-mal geändert.
( 0x2b || !0x2b )

Burns
Beiträge: 97
Registriert: 10.07.2004 15:10:46
Wohnort: Aachen
Kontaktdaten:

Beitrag von Burns » 11.07.2004 16:09:58

Hi Schorsch,

ich bin mit C++ nicht wirklich fit, aber wieso bekommt IntArray in Zeile 56 einen Parameter und in Zeile 55 zwei?

Benutzeravatar
Erdbeer-Schorsch
Beiträge: 219
Registriert: 31.07.2003 23:59:34
Kontaktdaten:

Beitrag von Erdbeer-Schorsch » 11.07.2004 16:13:14

Hi!
Burns hat geschrieben: ich bin mit C++ nicht wirklich fit,
Ich auch nicht 8)

Die Klasse hat insgesamt 4 Konstruktoren. In C++ kann man Funktionen überschreiben sodass sie jeweils andere Parameter benötigen.

Gruß

Schorsch
Zuletzt geändert von Erdbeer-Schorsch am 11.07.2004 16:15:40, insgesamt 1-mal geändert.
( 0x2b || !0x2b )

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 11.07.2004 16:14:47

Von Standard verschoben.
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de

Benutzeravatar
Erdbeer-Schorsch
Beiträge: 219
Registriert: 31.07.2003 23:59:34
Kontaktdaten:

Beitrag von Erdbeer-Schorsch » 12.07.2004 19:16:47

Erdbeer-Schorsch hat geschrieben:Hi!
Das Problem hat sich gerade erledigt:
Schorsch
Und jetzt ist es wieder da. :(
Der Quellcode ist unverändert, trotzdem kann ich nicht mehr kompilieren, im gegensatz zu gestern.

Anbei mal die Dateien:

IntArray.cpp
TestIntArray.cpp
IntArray.h

So rufe ich g++ auf:
g++ -o programm IntArray.cpp TestIntArray.cpp -Wno-deprecated

Woran kann das liegen?

Danke

Schorsch
( 0x2b || !0x2b )

Benutzeravatar
bitbieger
Beiträge: 179
Registriert: 23.10.2003 08:26:00
Kontaktdaten:

Re: g++ spinnt?

Beitrag von bitbieger » 13.07.2004 09:13:05

Erdbeer-Schorsch hat geschrieben:

Code: Alles auswählen

IntArray::IntArray(int * a,  int anzahl){
	
	IntArray(anzahl); /* Zeile 56 */
	
	for(int i = 0; i < this -> GetAnz(); i++)
	{
		(*this)[i+1] = a[i];
	}
}
Heisst das, du versuchst eine Klasse zu bauen, die sich selbst benutzt? Oder willst du einfach nur einen anderen Constructor aufrufen. Da wäre die Syntax dann eher:

Code: Alles auswählen

IntArray::IntArray(int * a,  int anzahl) : IntArray(anzahl)
{
	for(int i = 0; i < GetAnz(); i++)
	{
		(*this)[i+1] = a[i];
	}
}

der bitbieger...

Benutzeravatar
Erdbeer-Schorsch
Beiträge: 219
Registriert: 31.07.2003 23:59:34
Kontaktdaten:

Beitrag von Erdbeer-Schorsch » 13.07.2004 21:17:08

Hi bitbieger!

Ich will einen anderen Konstruktor aufrufen. Deine Variante spuckt bei mir auch einen Fehler aus, zudem meine ich das diese Variante auch nur funktioniert wird wenn man einen Parameter an einen Konstrutkor einer Elternklasse delegieren will.

Außerdem konnte ich diesen Quelltext schon mal komlilieren und habe ihn seit dem auch nicht mehr verändert. Auch die Fehlermeldung finde ich komisch,

Diese dürfte eigentlich nur kommen wenn ich sowas mache:

int foo( int bar)
{
int bar = 0;
}

Habe hier schon mal nen Beitrag gelesen das dies an defektem RAM liegen könnte?

Gruß

Schorsch
( 0x2b || !0x2b )

Benutzeravatar
bitbieger
Beiträge: 179
Registriert: 23.10.2003 08:26:00
Kontaktdaten:

Beitrag von bitbieger » 14.07.2004 08:47:05

Erdbeer-Schorsch hat geschrieben:...zudem meine ich das diese Variante auch nur funktioniert wird wenn man einen Parameter an einen Konstrutkor einer Elternklasse delegieren will.
Hast Recht, ich hab nicht aufgepasst. Es wäre mir allerdings neu, dass man einen anderen C'tor der eigenen Klasse direkt aufrufen kann. Das habe ich bisher noch nicht gesehen... I.d.R. wird man da eher eine Init-Funktion benutzen, die dann von den verschiedenen C'toren aufgerufen werden kann.


cu,
bitbieger

Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

Beitrag von lisan » 14.07.2004 09:54:32

Hi,

Es wurde schon des oefteren diskutiert, konstruktoren als funktion wie es versuchst auszufuehren - das geht derzeit nicht.

In deinem Fall wird eine weitere instanz erstellt.

Du musst wohl umdesignen.

Gruss,
Lisan.

p.s. IntArray ist keine Methode, die du aufrufst sondern ein Konstruktor -> eine neue instanz wird erstellt.

Richtig heissen muesste es also in deinem Fall

Code: Alles auswählen

IntArray(foo) bar;
nur ist es nicht das was du willst.
Bau dir einen init() workaround.

oder eine

Code: Alles auswählen

IntArray *getInstance() { return instance; }
IntArray* instance;

IntArray::IntArray(foo, bar) {
  instance = new IntArray(foo)
...
}
Naja speicherverschwendung.

Antworten