Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

03.03.2008, 21:10

Problem mit Rückgabetyp "string" bei Funktionsdekl

Hallo,

ich wollte zur Übung eine Klasse für Komplexe Zahlen schreiben und habe nun ein Problem bei einer Funktionsdeklaration einer Funktion, die einen string als Rückgabe hat:

(Die Problem-Funktion ist ganz unten)

C-/C++-Quelltext

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//ComplexNumber.h

#include <iostream>
#include <string>

class ComplexNumber {
private:
    float real;
    float imag;

public:
    inline ComplexNumber(float r, float i) : real(r), imag(i) {
    }
    
    inline ComplexNumber(const ComplexNumber &cn) {
        this->real= cn.real;
        this->imag= cn.imag;
    }

    inline ComplexNumber operator + (const ComplexNumber &a) {
        return ComplexNumber(this->real+a.real, this->imag+a.imag);
    }

    inline ComplexNumber operator - (const ComplexNumber &a) {
        return ComplexNumber(this->real-a.real, this->imag-a.imag);
    }

    inline ComplexNumber operator * (const ComplexNumber &a) {
        return ComplexNumber(this->real*a.real - this->imag*a.imag, this->real*a.imag + this->imag*a.real);
    }

    inline ComplexNumber operator / (const ComplexNumber &a) {
        float x= a.real*a.real + a.imag*a.imag; // Nur einmal berechnen spart Rechenzeit^^)

        float r;
        float i;
        r=(this->real*a.real + this->imag*a.imag) / (x);
        i=(this->imag*a.real - this->real*+a.imag ) / (x);
        return ComplexNumber(r,i);
    }



    void print();
    string toString();

};



Die Fehlermeldung sieht so aus :

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1>------ Erstellen gestartet: Projekt: ComplexNumber, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>ComplexNumber.cpp
1>e:\directx\projects\sonstiges\complexnumber\complexnumber.h(42) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'toString'
1>e:\directx\projects\sonstiges\complexnumber\complexnumber.h(42) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>e:\directx\projects\sonstiges\complexnumber\complexnumber.h(42) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>e:\directx\projects\sonstiges\complexnumber\complexnumber.h(42) : warning C4183: 'toString': Rückgabetyp fehlt; Memberfunktion, die 'int' zurückgibt wird angenommen
1>e:\directx\projects\sonstiges\complexnumber\complexnumber.cpp(10) : error C2556: 'std::string ComplexNumber::toString(void)': Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'int ComplexNumber::toString(void)'
1>        e:\directx\projects\sonstiges\complexnumber\complexnumber.h(42): Siehe Deklaration von 'ComplexNumber::toString'
1>e:\directx\projects\sonstiges\complexnumber\complexnumber.cpp(10) : error C2371: 'ComplexNumber::toString': Neudefinition; unterschiedliche Basistypen
1>        e:\directx\projects\sonstiges\complexnumber\complexnumber.h(42): Siehe Deklaration von 'ComplexNumber::toString'
1>test.cpp
1>e:\directx\projects\sonstiges\complexnumber\complexnumber.h(42) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'toString'
1>e:\directx\projects\sonstiges\complexnumber\complexnumber.h(42) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>e:\directx\projects\sonstiges\complexnumber\complexnumber.h(42) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>e:\directx\projects\sonstiges\complexnumber\complexnumber.h(42) : warning C4183: 'toString': Rückgabetyp fehlt; Memberfunktion, die 'int' zurückgibt wird angenommen
1>Code wird generiert...
1>Das Buildprotokoll wurde unter "file://e:\DirectX\Projects\Sonstiges\ComplexNumber\Debug\BuildLog.htm" gespeichert.
1>ComplexNumber - 8 Fehler, 2 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========



Wenn ich die Funktion direkt in der .cpp Datei definiere gehts....
In der header Datei scheint der Typ string nicht zu funktionieren, obgleich der dazugehörige Header richtig eingebunden ist.
Ich kann in der Headerdatei auch keinen string definieren. Es kommt zu einem ähnlichen Fehler.
In der .cpp Datei geht es aber problemlos....

Die .cpp sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "ComplexNumber.h"

using namespace std;

void ComplexNumber::print() {

    cout<<this->real<<"+"<<this->imag<<"i"<<endl;
}

string ComplexNumber::toString() {
    
    return "test";
}

//string test="hallo"; --> das geht!! In der .h geht das nicht!


Kann mir jemand weiterhelfen?
Vielen Dank im voraus.
MfG
Fury

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

03.03.2008, 21:11

Du hast den Namespace vergessen:

C-/C++-Quelltext

1
std::string toString();


Wieso erfindest du das Rad eigentlich neu? :)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#include <conio.h>
#include <complex>
#include <iostream>

int main()
{
    std::complex< float > foo( 5, 3 );
    std::cout << foo;

    _getch();
}
@D13_Dreinig

3

03.03.2008, 21:12

Namensraum im Header mit angeben!

C-/C++-Quelltext

1
std::string toString() const;
... warum selber machen, wenn es so eine Klasse (in wesentlich besserer Form) schon im Standard gibt? (<numeric> => std::complex)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

4

03.03.2008, 21:15

Vielen vielen vielen Dank!

Ich wusste nicht, dass string im namspace std ist!

Ich habe die Klasse ja nur als Übung geschrieben :).

Um mein Wissen noch etwas zu erweitern :

Was bedeutet denn nochmal "const" am Ende einer Funktionsdeklaration?

const vor einer Variablen ist klar...

PS: Ich hab bist jetzt nur Java gelernt und da gibts sowas nicht.
MfG
Fury

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

03.03.2008, 21:16

Zitat von »"Deviloper"«

Namensraum im Header mit angeben!

C-/C++-Quelltext

1
std::string toString() const;
... warum selber machen, wenn es so eine Klasse (in wesentlich besserer Form) schon im Standard gibt? (<numeric> => std::complex)


Ne, nicht in numeric. In complex. ;)

Zitat von »"Fury"«

Vielen vielen vielen Dank!

Ich wusste nicht, dass string im namspace std ist!

Ich habe die Klasse ja nur als Übung geschrieben :).


Der Ganze standard C++ Kram ist in diesem Namespace! :p
@D13_Dreinig

6

03.03.2008, 21:21

danke :) bitte noch mein edit im oberen post beachten :).
Ihr seid ja so schnell da ist die Antwort schneller da, als man braucht um die Frage zu schreiben^^.
MfG
Fury

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

03.03.2008, 21:24

Zitat von »"Fury"«

danke :) bitte noch mein edit im oberen post beachten :).
Ihr seid ja so schnell da ist die Antwort schneller da, als man braucht um die Frage zu schreiben^^.


Genau... Quantität statt Qualität... oder so *hust* :badgrin:
@D13_Dreinig

8

03.03.2008, 21:30

Zitat

C-/C++-Quelltext

1
std::string toString() const;


Weisst du denn was das const in diesem Zusammenhang bedeutet?
MfG
Fury

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

03.03.2008, 21:38

Das const markiert die Funktion als konstant. Das heißt die Funktion kann auch mit konstanten Objekten aufgerufen werden:

C-/C++-Quelltext

1
2
3
const ComplexNumber foo;

foo.ToString(); // <<-- klappt weil ToString() konstant ist


Wichtig ist das auch bei der Übergabe von konstanten Referenzen (um Temporäre Objektkopien zu vermeiden):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
void bar( const ComplexNumber& number )
{
  number.ToString(); // <<-- klappt, weil ToString() konstant ist

}

// ...

ComplexNumber foo;
bar( foo ); // foo wird als konstante Referenz übergeben
@D13_Dreinig

10

03.03.2008, 21:50

Das ist cool danke :).
Sowas gibts in Java nicht. Da kann man eben auf konstanten Objekten nur Methoden aufrufen, die diese nicht verändern. Man kann aber solche Methoden nicht kennzeichnen.

Darf man dann in c++ eine funktion, die nicht als const markiert ist, das object aber nicht verwändert, trotzdem nicht auf konstanten Objekten aufrufen?
MfG
Fury

Werbeanzeige