Toon posts:

[C++]Constructor-probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer een class aan de praat te krijgen die een config-file parst en de relevante info bijhoudt. Daarbij gebruik ik een default constructor en een constructor die als argument een pad naar een config-file meegeeft. Die eerste wordt probleemloos aangeroepen, bij de tweede krijg ik de foutmelding (met gcc 3.3.2):

configparser.C: In constructor `ConfigParser::ConfigParser(const std::string&)':
configparser.C:25: error: no match for call to `(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >) ()'
make: *** [configparser.o] Fout 1

Ik raak er niet wijs uit. Zie niet in wat er verkeerd is aan de code. Mocht iemand een clue hebben -> ik hoor het graag. De code die ik gebruik voor de constructor (doet voorlopig niet meer dan het pad naar de configfile weergeven) is:

code:
1
2
3
ConfigParser::ConfigParser(const string& configfile) throw (runtime_error): configfile_(configfile){
        cout << configfile();
}


Class:
code:
1
2
3
4
5
6
7
8
9
10
11
class ConfigParser {
        public:
                ConfigParser() throw (runtime_error);
                ConfigParser(const string& configfile) throw (runtime_error);
                ~ConfigParser();
                const string& configfile() const {return configfile_;}
                //blabla
    private:
        string configfile_;
        //blabla
};

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom staan die haakjes achter configfile?

.edit: hier bedoel ik dus:
C++:
1
        cout << configfile();

[ Voor 48% gewijzigd door .oisyn op 20-07-2004 19:48 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Hij denkt dat je een operator() aanroept op configfile.

edit:
post nooit als je net wakker wordt...hoeveel foutjes kan ik maken in een zin...sjees

[ Voor 87% gewijzigd door Zoijar op 20-07-2004 19:54 ]


Verwijderd

Topicstarter
code:
1
cout << configfile();

Is een oproep naar de lidfunctie configfile().
Hoe kan je de compiler duidelijk maken dat die geen operator() moet toepassen, maar de lidfunctie configfile() moet toepassen?

En waarom geeft hij dan geen error in de default constructor, die gebruikt nl dezelfde functie:
code:
1
2
3
ConfigParser::ConfigParser() throw (runtime_error): configfile_("/home/user01/test/test.config"){
        cout << configfile();
}

Ik vat het toch niet zo :? Maar toch al bedankt voor jullie reactie want zit behoorlijk vast door dit ding...

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Omdat in je default ctor heb je geen argument dat 'configfile' heet.

Maar configfile() is dus ook een member functie die een string returned? Dan kan je "this->configfile()" doen.

  • IcE_364
  • Registratie: Februari 2002
  • Laatst online: 22-05 11:48
Verwijderd schreef op 20 juli 2004 @ 19:44:
Ik probeer een class aan de praat te krijgen die een config-file parst en de relevante info bijhoudt. Daarbij gebruik ik een default constructor en een constructor die als argument een pad naar een config-file meegeeft. Die eerste wordt probleemloos aangeroepen, bij de tweede krijg ik de foutmelding (met gcc 3.3.2):

configparser.C: In constructor `ConfigParser::ConfigParser(const std::string&)':
configparser.C:25: error: no match for call to `(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >) ()'
make: *** [configparser.o] Fout 1

Ik raak er niet wijs uit. Zie niet in wat er verkeerd is aan de code. Mocht iemand een clue hebben -> ik hoor het graag. De code die ik gebruik voor de constructor (doet voorlopig niet meer dan het pad naar de configfile weergeven) is:

code:
1
2
3
ConfigParser::ConfigParser(const string& configfile) throw (runtime_error): configfile_(configfile){
        cout << configfile();
}


Class:
code:
1
2
3
4
5
6
7
8
9
10
11
class ConfigParser {
        public:
                ConfigParser() throw (runtime_error);
                ConfigParser(const string& configfile) throw (runtime_error);
                ~ConfigParser();
                const string& configfile() const {return configfile_;}
                //blabla
    private:
        string configfile_;
        //blabla
};
Dit komt doordat je parameter configfile hetzelfde heet als je methode configfile();
dit kun je verhelpen door je parameter een andere naam te geven of door je methode configfile() aan te roepen als this->configfile();

[ Voor 4% gewijzigd door IcE_364 op 20-07-2004 20:14 ]


Verwijderd

Topicstarter
Idd -> een beetje een ongelukkige naamkeuze als parameter ook |:(. Bedankt voor de (snelle) hulp. Compileert nu netjes :)

  • IcE_364
  • Registratie: Februari 2002
  • Laatst online: 22-05 11:48
Verwijderd schreef op 20 juli 2004 @ 20:14:
Idd -> een beetje een ongelukkige naamkeuze als parameter ook |:(. Bedankt voor de (snelle) hulp. Compileert nu netjes :)
Een manier om dit te voorkomen is om een bijv alle functies pascal case te schrijven, en alle variabelen in camel case. Dan krijg je bijv

C++:
1
2
3
4
5
class ConfigParser
{
      ConfigParser(const string& configFile);
      const string ConfigFile() const;
};


Dan komen dit soort problemen veel minder snel voor. :)

[ Voor 4% gewijzigd door IcE_364 op 20-07-2004 21:15 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

IcE_364 schreef op 20 juli 2004 @ 20:39:
Een manier om dit te voorkomen is om een bijv alle functies pascal case te schrijven, en alle variabelen in camel case. Dan krijg je bijv
Dan komen dit soort problemen veel minder snel voor. :)
Leest ook zo makkelijk dan ;)

  • IcE_364
  • Registratie: Februari 2002
  • Laatst online: 22-05 11:48
Zoijar schreef op 20 juli 2004 @ 20:46:
[...]

Leest ook zo makkelijk dan ;)
Ok, blijft handiger idd om een andere naam ervoor te bedenken gewoon, maar het is zowieso handig om een bepaalde casing te gebruiken in je code imo.

Verwijderd

Topicstarter
EDIT: Probleem is al opgelost door
code:
1
ifstream ifs(configfile().c_str());
te definieren.


Dat duidelijke verschil tss functies en variabelen is idd een must eigenlijk.
Ben alweer op een probleempje gestoten ondertussen... Nog steeds in de constructor (vandaar post in same topic).
Het is de bedoeling dat de file daadwerkelijk geparsed wordt natuurlijk. Voor het parsen zelf heb ik ondertussen al een goeie lib, maar het meegeven van de file als argument levert wat troubles op. Het uiteindelijke resultaat zou moeten zijn:

code:
1
2
3
4
5
6
7
8
9
10
ConfigParser::ConfigParser(const string& configspecs) throw (runtime_error): configfile_(configspecs){
       ifstream ifs(configfile());
       /* (!ifs)
                throw runtime_error(configfile() + " kon niet geopend worden");
        Util::Props config(ifs);
        port_ = config["portnr"];
        logfile_ = config["logfile"];
        docroot_ = config["documentroot"];
        typesfile_ = config["typesfile"];*/
}


Die
code:
1
ifstream ifs(configfile());
levert echter volgende errors op:

configparser.C: In constructor `ConfigParser::ConfigParser(const std::string&)':
configparser.C:26: error: no matching function for call to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
/usr/include/c++/3.3.2/iosfwd:89: error: candidates are: std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(const std::basic_ifstream<char, std::char_traits<char> >&)
/usr/include/c++/3.3.2/fstream:519: error: std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3.2/fstream:504: error: std::basic_ifstream<_CharT, _Traits>::basic_ifstream() [with _CharT = char, _Traits = std::char_traits<char>]

Ik ben nogal snel de weg kwijt in die errorcodes ;(, maar ik dacht wel dat die ifstream zo gedefinieerd kon worden. Wat zie ik over het hoofd?

[ Voor 9% gewijzigd door Verwijderd op 20-07-2004 21:12 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Verwijderd schreef op 20 juli 2004 @ 21:08:
configparser.C: In constructor `ConfigParser::ConfigParser(const std::string&)':
configparser.C:26: error: no matching function for call to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
Ok, er gaat iets fout bij basic_ifstream, dat is jouw std::ifstream, en wel bij de constructor die een basic_string meekrijgt. Er staat dus eigenlijk: "Geen functie gevonden voor: ifstream(string&)" (je moet een beetje door de STL heen lezen, toegegeven ietsjes lastig soms.
/usr/include/c++/3.3.2/iosfwd:89: error: candidates are:
Aha, het is niet zo dat er geen functie kan worden gevonden, hij vindt er juist teveel en kan niet kiezen!
std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(const std::basic_ifstream<char, std::char_traits<char> >&)
1) de copy constructor, ifstream(ifstream&) (laat even alle const etc weg)
/usr/include/c++/3.3.2/fstream:519: error: std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]
2) ctor met char* en openmode, ifstream(char*, ios::openmode)
/usr/include/c++/3.3.2/fstream:504: error: std::basic_ifstream<_CharT, _Traits>::basic_ifstream() [with _CharT = char, _Traits = std::char_traits<char>]
3) default ctor, ifstream()

Jij gaf een std::string& door, maar die wordt in geen enkele ctor gevraagd. Het dichtse bij ligt de char*, dus moet je je string omzetten naar char*. En dat kan met de member functie c_str(). Dus je moet dit doen:

code:
1
ifstream ifs(configfile().c_str());
Pagina: 1