2017-01-19 2 views
1

Можно ли назвать этот элемент int MyClass::get(int key) const вместо int& MyClass::get(int key)? Другими словами, где в исходных кодах C++ можно использовать значение, но не ссылку?Как вызвать эту функцию-член в C++?

#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

Почему у вас есть старомодный листинг здесь '(int) abc.get (16)'? –

+3

В C++ 17 вы сможете использовать 'std :: as_const (abc) .get (...)'. В противном случае вы можете привязать 'abc' к' const MyClass & '. Заметьте, что я не поощряю такой дизайн, хотя – KABoissonneault

ответ

3

Самым простым решением является использование const & к переменной. Два простых способа являются

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

или

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

Edit: Похоже, вы пытаетесь выбрать перегрузку на основе возвращаемого типа, на основе этих двух линий:

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

See this answer, объясняя, как тип возврата никогда не используется во время разрешения перегрузки.

+0

Большое спасибо. Это именно то, что я ищу –

Смежные вопросы