2017-01-19 1 views
1

Ist es möglich, dieses Mitglied int MyClass::get(int key) const anstelle der int& MyClass::get(int key) zu nennen? Mit anderen Worten, wo in den C++ - Quellcodes kann ein Wert verwendet werden, aber keine Referenz?Wie Sie diese Memberfunktion in C++ aufrufen?

#include <iostream> 
using namespace std; 

class MyClass { 
public: 
    MyClass(int input) : i(input) {}; 
    int i; 

    int get(int key) const { 
     std::cout << "int get(int key) const " << key << std::endl; 
     return i; 
    } 

    int& get(int key) { 
     std::cout << "int& get(int key) " << key << std::endl; 
     return i; 
    } 
}; 

void dummy(const int helpme) 
{ 
    std::cout << helpme << std::endl; 
} 

int main() { 
    // your code goes here 
    MyClass abc(6); 
    std::cout << abc.get(13) << std::endl; 
    int result = (int)abc.get(16); 
    dummy(abc.get(18)); 
    return 0; 
} 
+0

Warum hast du eine altmodische Besetzung hier '(int) abc.get (16)'? –

+3

In C++ 17 können Sie 'std :: as_const (abc) .get (...)' verwenden. Andernfalls können Sie 'abc' an eine' const MyClass & 'binden. Beachten Sie, dass ich diese Art von Design nicht ermutigen, obwohl – KABoissonneault

Antwort

3

Die einfachste Lösung ist eine const & auf Ihre Variable zu verwenden. Zwei einfache Wege sind

const auto & abc_const = abc; 
std::cout << abc_const.get(13) << std::endl; 

oder

std::cout << static_cast<const MyClass&>(abc).get(13) << std::endl; 

Edit: Es sieht aus wie Sie eine Überlastung zu wählen versuchten, auf der Grundlage der Rückgabetyp, basierend auf diesen beiden Linien:

int result = (int)abc.get(16); 
dummy(abc.get(18)); 

See this answer erläutert, wie der Rückgabetyp bei der Überladungsauflösung nie verwendet wird.

+0

Vielen Dank. Genau das suche ich –

Verwandte Themen