2017-09-22 1 views
3

Der Einfachheit halber übergeben Sie einfach einen Teil des Codes.const Vektorreferenz überladen

class A { 
public: 
std::vector<int> & get(){ return myVector;} 
const std::vector<int> & get() const {return myVector;} 
private: 
    std::vector<int> myVector; 
} 

Meine Frage ist, wie man überladen Const erhalten Methode. Wenn ich versuche, const_iterator und Debug-Code zu erstellen, handelt es sich um eine nicht-konstante Methode. wollen verstehen, wie es funktioniert Ich verwende die folgenden Schnipsel

A myA; 
myA.get().push_back(1); 
for (const auto& v: myA.get()) { } // it involve not const get method 

oder

std::vector<int>::const_iterator cit = myA.get().begin() 
//it involves not const method 

oder

const std::vector<int> v = myA.get(); 
// involves non-const method 

oder sogar Funktion, die ich schaffen:

int constVector(const std::vector<int> &constVector) 
{ 
    return constVector[0]; 
} 

int b = constVector(myA.get()); // it involves non-const method 

Was ist der Pu rpose der überladenen const-Methode, wenn sie nicht beteiligt sind.

Und was mache ich falsch und wie kann ich die Const-Methode einbeziehen.

+1

Die Methode const heißt *, wenn der Verweis auf A const * ist. –

Antwort

8

Da myA nicht selbstconst, Überladungsauflösung wird das nicht const Überlastung begünstigen.

Das ist das Leben, fürchte ich.

Wenn Sie wollen, dass die const Version dann könnte man const_cast auf der rufenden Seite nutzen, oder sogar eine implizite Umwandlung, die myA zu einem const Typ würfen

const A& myA_const = myA; 

und myA_const verwenden, wo Sie die const wollen Überladung genannt werden.

+1

Ich bin zu spät für die Antwort, aber Sie können das MCVE hinzufügen, das ich auf [ideone] vorbereitet habe (https://ideone.com/3fmemE). – Scheff

+2

@Scheff: Warum denkst du, du bist zu spät? Sie antworten mit diesem Link, und ich werde upvote. SO funktioniert am besten, wenn mehrere Antworten zur Auswahl stehen. – Bathsheba

5

nahm ich die Code-Fragmente des OP und machte eine MCVE, die zeigt, was Bathsheba beschreibt:

#include <iostream> 
#include <vector> 

class A { 
    public: 
    std::vector<int>& get() 
    { 
     std::cout << "A::get()" << std::endl; 
     return myVector; 
    } 
    const std::vector<int>& get() const 
    { 
     std::cout << "A::get() const" << std::endl; 
     return myVector; 
    } 

    private: 
    std::vector<int> myVector; 
}; 

int main() 
{ 
    A myA; 
    myA.get().push_back(1); 
    for (const auto& v: myA.get()) { } // it involve not const get method 
    // use const reference to instance 
    std::cout << "use const reference to instance" << std::endl; 
    { const A &myAC = myA; 
    for (const auto& v: myAC.get()) { } // it involves const get method 
    } 
    return 0; 
} 

Ausgang:

A::get() 
A::get() 
use const reference to instance 
A::get() const 

Getestet auf ideone.