C++ String als Return und Parameter

noxiouzz

Lieutenant
Registriert
Aug. 2011
Beiträge
818
Huhu :)

Hab hier ein Problem bei der Übergabe und Rückgabe von Strings. Bekomme diese Meldung:
"main.cpp|30|error: no matching function for call to 'Application::Load(std::string&)'|"

Hier mein Quelltext:

main.ccp
Code:
#include <string>
#include "Application.h"

using namespace std;

int main()
{
    int documents = 7;
    string path = "", folder = ".\\", dataname[documents], text[documents];

    for (int i = 0; i < documents; i++)
    {
        text[i] = "";
    }

    dataname[0] = "a";
    dataname[1] = "b";
    dataname[2] = "c";
    dataname[3] = "d";
    dataname[4] = "e";
    dataname[5] = "f";
    dataname[6] = "g";

    Application *application = new Application;

    for (int i = 0; i < documents; i++)
    {
        path = folder + dataname[i];
        text[i] = application->Load(path);
    }

    delete application;
}

Application.h
Code:
#ifndef APPLICATION_H
#define APPLICATION_H
#include <string>

using namespace std;

class Application
{
    public:
        Application();
        virtual ~Application();
        
        string text;

        string Load (string path);
        void Save ();
    protected:
    private:
};

Application.ccp
Hier nur der interessante Teil
Code:
#include "Application.h"

using namespace std;

Application::Application()
{
    text = "";
}

Application::~Application()
{
}

string Application::Load(string path)
{
    return text;
}

Hat jemand ne Ahnung woran es liegt? Bin eh schon voll verwirrt vom String :O
 
Zuletzt bearbeitet:
Bei Zeigern musst du den Konstruktor aufrufen.
Code:
Application *application = new Application( <irgendwas> );
 
du solltst den String nicht per value sondern per reference übergen
Code:
string Application::Load(string const & path)  //natürlich auch im Header entsprechend anpassen
{
    return text;
}
 
Zuletzt bearbeitet: (falsch gelesen)
Das wär mir neu :D
Der gibt ihm ja Speicher, der Fehler kommt in der Zeile:
Code:
text[i] = application->Load(path);
Ergänzung ()

@the_nobs
also so
CPP:
Code:
string Application::Load(string const &path)
und so
Header:
Code:
string Load (string const &path);
?

In der main bleibt alles gleich?
Irgendwie wills nich klappen.
 
welchen compiler benutzt du?

unter Visual Studio 2005 funktioniert das ohne probs
egal ob ich das const reinhänge oder nicht.

Das einzige problem hat er hier
Code:
    int documents = 7;
    string path = "", folder = ".\\", dataname[documents], text[documents];
IMHO ist es in C++ nicht erlaubt so ein array anzulegen, da ja eigentlich erst während der laufzeit bekannt ist, was in "documents" steht
 
Zuletzt bearbeitet:
hmmm...

statt den arrays solltest du einen Vector nutzen...
aber das sollte eigentlich egal sein für das problem.

Wenn du die eine zeile rausnimmst lässt es sich kompilieren?
falls nicht, kann sein das der Compiler den fehler wo anders hat, aber nicth richtig zuordnen kann.
 
schmeiss das using namespace std raus. im header file
und gib dafür explizit den namespace an
Code:
#include <string>

//using namespace std;

class Application
{
    public:
        Application();
        virtual ~Application();
        
        std::string text;

        std::string Load (std::string path);
        void Save ();
    protected:
    private:
};
 
kannst du die dateien direct uploaden, damit bei copy & paste nicht irgendwelche sonderzeichen rausgelöscht werden?
habs jetzt in VS2010 auch probiert
alles einwandfrei
 
Code:
1>main.cpp(29): error C2660: 'Application::Load': Funktion akzeptiert keine 1 Argumente
1>  Application.cpp
1>application.cpp(16): error C2511: 'std::string Application::Load(std::string)': Überladene Memberfunktion nicht in 'Application' gefunden
1> application.h(9): Siehe Deklaration von 'Application'

Das eben war quatsch ^^

Irgendwie kapiert der nicht das Application nen String Parameter hat :O
 
Zuletzt bearbeitet:
Der code den du oben gepostet hast, kann dann nicht der code sein der compiliert wird!
Der compilier regt sich auf das du die Methode "load" unterschiedlich definiert hast.

Wie bereits gesagt, bitte deinen code direct als zipfile uploaden/attachen
ich glaub wir spielen da gerade stumme post
 
Hab mal den ursprünglichen Code mit dem VS2010 ausprobiert:

1.) @Application.h:
Code:
#endif
fehlt am Ende.

2.) @main.cpp: "documents" muss "const" sein:
Code:
 const int documents = 7;
ansonsten "dataname" und "text" auf dem Heap anlegen:
Code:
 string* dataname = new string[documents];
 string* text = new string[documents];

 // ... 

 delete[] datename;
 delete[] text;

Danach funktioniert es ohne Probleme und auch die Inhalte der Strings werden übertragen, wie es im Code angegeben ist. Das mit den Namespaces macht keinen Unterschied.
 
Zuletzt bearbeitet:
endif hab ich dran... Sorry hab gecuttet ^^
Aber const muss man bei Codeblocks nicht nutzen.



oO Nachdem ich VS geschlossen und Codeblocks neu geöffnet habe, macht er es ?
Das ist schon wieder sowas... Ne Stunde Fehlersuche und die Lösung macht für mich keinen Sinn.

Ich hatte die beiden Application Dateien aus nem anderen Ordner dem Projekt zugewiesen. Kann es sein, dass er die neuen zwar im Projekt Ordner speichert, aber bis zum funktionierenden Build noch die Dateien aus dem anderen Ordner benutzt?

Hmpf egal Hauptsache es klappt. Danke euch :D
 
Zuletzt bearbeitet:
noxiouzz schrieb:
Ergänzung ()

@the_nobs
also so
CPP:
Code:
string Application::Load(string const &path)
und so
Header:
Code:
string Load (string const &path);
?

In der main bleibt alles gleich?
Irgendwie wills nich klappen.

Die übliche Schreibweise wäre allerdings diese ;)

Code:
string Load(const string& path)
 
Fonce schrieb:
Die übliche Schreibweise wäre allerdings diese ;)

Code:
string Load(const string& path)

Darüber scheiden sich die Geister. Es gibt durchaus jede Menge Programmierer, die der anderen Schreibweise den Vorzug geben.
Ergänzung ()

Yuuri schrieb:
Bei Zeigern musst du den Konstruktor aufrufen.
Code:
Application *application = new Application( <irgendwas> );

Nee, muss er nicht. Seine Application-Klasse hat einen parameterlosen Default-Konstruktor ... das heißt, der wird implizit hergenommen, wenn du:

Application *application = new Application

schreibst.

@noxiouzz

Du hast es ja nun bestimmt schon gemerkt. Kritzele bei einer Problembeschreibung niemals irgend was zusammen, von dem du meinst, daß es schon nahe genug an deiner Problematik liegen wird. Nimm deinen ursprünglichen Code und poste den, so wie er ist, hier ... ansonsten verschwendest du nur Zeit - deine und die der Leute, die dir helfen wollen.
 
Zuletzt bearbeitet:
Zurück
Oben