Schrift
[thread]11129[/thread]

Hilfe zu Fehlermeldung C2440

Leser: 1


<< >> 6 Einträge, 1 Seite
pktm
 2008-01-11 00:58
#104599 #104599
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Im Zuge eines c++-Kurses stehe ich vor folgender Aufgabe:
Erstellung einer String-Klasse, die einen Char-Vektor nimmt und daraus einen String macht.

Der Aufruf in der main()-Methode sieht so aus:
Code: (dl )
1
2
3
4
5
	char cv1[6];
cv1[0] = 'a';
cv1[1] = 'b';

String s2 = new String(cv1);


Der Konstruktor meiner String-Klasse sieht su aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
	String( char cv1[] )
{
init_from_char_vector(cv1);
}

void init_from_char_vector( char cv1[] )
{
int length = 0;

while( cv1[length] != 0 )
{
++length;
}

// wenn der Vektor zu lang ist wird eine Fehlermeldung erzeugt.
if( length > MAXSTRINGLENGTH ) {
//cout << "Fehler: Charvektor zu gross!" << "\n";
throw 1;
}

for(int i = 0; i < length; i++ )
{
internal_string[i] = cv1[i];
}
}


Ich bekomme aber eine Fehlermeldung:
Quote
1>...stringtest.cpp(21) : error C2440: 'Initialisierung': 'String *' kann nicht in 'String' konvertiert werden
1> Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig


Hat wer Rat?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
murphy
 2008-01-11 11:32
#104611 #104611
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
pktm+2008-01-10 23:58:33--
[...]
String s2 = new String(cv1);
[...]


Das sollte doch C++ sein, kein Java ;-)

Der new-Operator legt eine Instanz der angegebenen Klasse auf dem Heap an und gibt in C++ daher einen Zeiger (String *) auf das neue Objekt zurück. Du hast aber die Variable, die den Rückgabewert aufnehmen soll als Wert (String) des Objekttyps deklariert. Das ist natürlich inkompatibel, was Dir der Compiler auch mitzuteilen versucht.

Richtig wäre also statt der oben zitierten Codezeile entweder
Code: (dl )
1
2
3
...
String s2(cvl);
...

oder
Code: (dl )
1
2
3
4
5
6
7
8
...
String *s2 = new String(cvl);
try {
...
}
finally {
delete s2;
}

When C++ is your hammer, every problem looks like your thumb.
pktm
 2008-01-11 16:03
#104623 #104623
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ah ok.
Das kommt davon wenn man sich an zu vielen Sprachen zugleich versucht :D
http://www.intergastro-service.de (mein erstes CMS :) )
nepos
 2008-01-13 13:01
#104660 #104660
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Eigentlich sollte es eine Referenz zurückgeben oder? Mein C++ ist schon ein wenig eingerostet...
murphy
 2008-01-13 14:42
#104664 #104664
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
nepos+2008-01-13 12:01:11--
Eigentlich sollte es eine Referenz zurückgeben oder? [...]


Nein, der new-Operator gibt definitiv einen Zeiger zurück, keine Referenz. Das hat unter anderem den Grund, dass Referenzen sich ja semantisch wie Werte verhalten, man also keinen delete-Operator auf sie anwenden kann, was im Falle des Rückgabewertes von new wenig intuitiv wäre. Ferner hat es den Grund, dass die Allokation des Speichers in new fehlschlagen kann, woraufhin der Aufruf von new unter Umständen [*] [tt]NULL[/tt] zurückgibt. Eine Referenz kann in C++ aber niemals [tt]NULL[/tt] sein. [*] Unter Umständen heißt hier: Falls Exceptions deaktiviert sind, oder der Compiler aus anderen abstrusen Gründen den throw()-Override des new-Operators ausgewählt hat ;-)
When C++ is your hammer, every problem looks like your thumb.
nepos
 2008-01-13 16:11
#104668 #104668
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ah ok, danke für die Hinweise :)
Bin echt froh, dass ich damit nicht mehr wirklich was machen muss...
<< >> 6 Einträge, 1 Seite



View all threads created 2008-01-11 00:58.