C++ metódus const modifier hatása

Fórumok

Hello,

van egy ilyen kód (kipucolva, leegyszerüsítve, hátha valakit tényleg érdekel :))

#include <iostream>
#include <maxminddb.h>

class MyClass {
    public:
        bool lookup(const std::string& name);

    private:
        MMDB_s mmdb;
};

bool MyClass::lookup(const std::string& target) {

    int gai_error, mmdb_error;
    MMDB_lookup_result_s r;

    r = MMDB_lookup_string(&mmdb, target.c_str(), &gai_error, &mmdb_error);
    return true;
}

int main() {
    MyClass *c;

    c = new MyClass();
    std::string s = "foo";
    c->lookup(s);

    return 0;
}

Ez ezzel a paranccsal le is fordul:

g++ prog.cc -lmaxminddb

(clang-al is).

Ha a lookup() fv-t const-ra módosítom, akkor a fordító (mindegyik) elkezd rinyálni, de az MMDB_lookup_string()-re:

        bool lookup(const std::string& name) const;

...

bool MyClass::lookup(const std::string& target) const {
prog.cc: In member function 'bool MyClass::lookup(const string&) const':
prog.cc:17:28: error: invalid conversion from 'const MMDB_s*' to 'MMDB_s*' [-fpermissive]
   17 |     r = MMDB_lookup_string(&mmdb, target.c_str(), &gai_error, &mmdb_error);
      |                            ^~~~~
      |                            |
      |                            const MMDB_s*
In file included from constcheck.cc:2:
/usr/include/x86_64-linux-gnu/maxminddb.h:204:66: note:   initializing argument 1 of 'MMDB_lookup_result_s MMDB_lookup_string(MMDB_s*, const char*, int*, int*)'
  204 |     extern MMDB_lookup_result_s MMDB_lookup_string(MMDB_s *const mmdb,
      |                                                    ~~~~~~~~~~~~~~^~~~

 

Tud segíteni valaki ennek megértésében? Miért a fv törzsön belül egy másik fv argumentumánál panaszkodik, és miért csak akkor, ha ha fv const? Ennélkül miért fogadja el?

Hozzászólások

A const metódus lényege, hogy nem változtathatja meg az objektum állapotát.  Más szóval egy const metódusban a te ojjektumod (this pointer) is const, és következésképp a benne lévő összes tagváltozó is az.  Így mivel az 'mmdb' tagváltozó const, ezért a fordító olyan MMDB_lookup_string() függvényt keres, ami egy const MMDB_s példányra mutató pointert vár, de ilyet nem talál, csak olyat, ami egy MMDB_s példányra mutató const pointert vár.  (Ha jól értettem... a különböző helyekre tett const jelentésébe könnyen bele lehet zavarodni.)  A const-ságot pedig nem lehet csak úgy implicit elkonvertálni, ezért hibát jelez.

A maxmindb frissítése megoldást jelenthet a problémára, lásd: https://github.com/maxmind/libmaxminddb/commit/0cc6caecc8118ca4b4c96c75…

A const metódus lényege, hogy nem változtathatja meg az objektum állapotát. 

Ahha, mármint ha a const a fv neve után van, akkor lesz maga a fv const (egyébként (pl const bool fv()) ugye egy olyan fv, aminek a visszatérési értéke lesz const). Na, ezt nem értettem pl, köszi.

ami egy const MMDB_s példányra mutató pointert vár, de ilyet nem talál, csak olyat, ami egy MMDB_s példányra mutató const pointert vár

Háá, ezt is értem - nagyon köszönöm! :)

Igen, a const (főleg így) eléggé be tud kavarni.

Köszi a linket, megnézem, újabb verzióval működik-e. És köszi mindent.