string als Funktionsparameter



  • Guten Tag zusammen,

    ich probiere gerade, ein Mehrdateienprogramm aufzusetzen. Allerdings bekomme ich eine kleine Kollektion von Fehlermeldungen zu sehen, wenn ich dieses kompilieren möchte (g++ (GCC) 4.1.2 20060928, KDevelop: 3.3.4). Ich vermute, es hängt damit zusammen, dass die Funktion aus Header und Quelldatei eine string-Variable als Parameter zugewiesen bekommt.

    // read.cpp
    #include <iostream>
    #include <fstream>
    #include <string>
    #include "read.h"
    
    using namespace std;
    
    int readconfig(string filepath_p) {
      ifstream conf_file;
      string filepath = filepath_p;
    
      conf_file.open(filepath.c_str(), ios_base::in);
      if (!conf_file) {
        cerr << "Could not find file: '" << filepath << "'\n";
        return 1;
      }
    
      char entry;
      while (!conf_file.eof()) {
        conf_file.get(entry); 
          cout << entry;
      }
      return 0;
    }
    
    // read.h
    
    #include <iostream>
    #include <fstream>
    #include <string>
    
    #ifndef readH
    #define readH
    
    int readconfig(string filepath_p);
    
    #endif
    
    // main.cpp
    // ...
    int test = readconfig("../../content/base.conf");
    cout << test;
    // ...
    

    Fehlermeldungen:

    compiling jomu.cpp (g++)
    /home/klip/dev/jomu/src/read.h:28: error: ‘string’ was not declared in this scope
    /home/klip/dev/jomu/src/main.cpp: In function ‘int main(int, char**)’:
    /home/klip/dev/jomu/src/main.cpp:45: error: ‘readconfig’ cannot be used as a function
    /home/klip/dev/jomu/src/main.cpp:46: error: expected `;' before ‘test’
    make[2]: *** [main.o] Error 1
    compiling read.cpp (g++)
    /home/klip/dev/jomu/src/read.h:28: error: ‘string’ was not declared in this scope
    /home/klip/dev/jomu/src/read.cpp: In function ‘int readconfig(std::string)’:
    /home/klip/dev/jomu/src/read.cpp:28: error: ‘int readconfig(std::string)’ redeclared as different kind of symbol
    /home/klip/dev/jomu/src/read.h:28: error: previous declaration of ‘int readconfig’
    

    Ich hoffe, jemand kann mir weiterhelfen.



  • // read.h
    
    #include <iostream>
    #include <fstream>
    #include <string>
    
    #ifndef readH
    #define readH
    
    int readconfig(std::string filepath_p);  // <--!!!
    
    #endif
    

    Einfach Namensraum angeben - und bitte nicht using namespace std; in Headern.



  • Oh, danke, das hat geklappt 🙂

    In der Header-Datei hab ich den namespace ja nicht angegeben. Aber in der read.cpp-Datei ist das in Ordnung, oder muss man generell darauf achten, den Namespace nur _einmal_ zu "verwenden" (in dem Fall hier jetzt in main.cpp)?



  • Klip schrieb:

    In der Header-Datei hab ich den namespace ja nicht angegeben. Aber in der read.cpp-Datei ist das in Ordnung [...]?

    Ist korrekt so.



  • Klip schrieb:

    Oh, danke, das hat geklappt 🙂

    In der Header-Datei hab ich den namespace ja nicht angegeben. Aber in der read.cpp-Datei ist das in Ordnung, oder muss man generell darauf achten, den Namespace nur _einmal_ zu "verwenden" (in dem Fall hier jetzt in main.cpp)?

    Nene, du hattest das nicht. Habs nur gesagt, weil das hier auch schon öfter gesagt wurde.
    In der .cpp ist es ok, solange innerhalb der Datei alles eineindeutig benamst ist. Das Problem ist, wenn du den Namespace im Header öffnest, dass er dann überall offen ist, wo du diesen Header inkludierst. Das mag bei kleinen Projekten oft kein Problem sein, ist aber nicht der Sinn von Namespaces; Namenskonflikte zu vermeiden.
    Also generell gesagt, nur da using namespace verwenden, wo es nötig und sinnvoll ist. Hast du in der main.cpp keine std Funktionen, lass es weg.



  • deine interne lokale kopie ist ueberfluessig und da du eh nur konstante methoden von std::string verwendest, sollest du "const std::string&" als übergabeüaramter verwenden (std::string kopien sind i.A. relativ teuer):

    [cpp]
    int readconfig(const std::string& filepath_p)
    {
    ifstream conf_file;
    //string filepath = filepath_p; //<-kopie unnötig

    conf_file.open(filepath.c_str(), ios_base::in);
    if (!conf_file)
    {
    cerr << "Could not find file: '" << filepath<< "'\n";
    return 1;
    }

    char entry;
    while (!conf_file.eof())
    {
    conf_file.get(entry);
    cout << entry;
    }
    return 0;
    }
    [/cpp]


Anmelden zum Antworten