C++ Protected / Public overloads

后端 未结 4 1891
無奈伤痛
無奈伤痛 2021-01-19 05:28

I have a class like this :

class Foo
{
public:
    Foo()
    {
        for(int i = 0; i < 10; ++i)
            v.push_back(i);
    };
    const vector<         


        
相关标签:
4条回答
  • 2021-01-19 06:07

    You are close to the solution. The compiler will select the const function if the Foo is also const.

    Foo foo;
    const Foo& cfoo = foo; 
    
    for(int i = 0; i < (int) cfoo.V().size(); ++i)
        cout << cfoo.V().at(i) << endl; 
    
    0 讨论(0)
  • 2021-01-19 06:10

    It is not possible to overload on return value. Non-const method will be used when the object is non-const. It is possible to guide the compiler by:

    const vector<double>& test = const_cast<Foo const&>(foo).V();
    

    Or possibly nicer solution is to have the constant method have different name (eg.: ConstV). Or you can just add this new method and leave the current method there. This approach is used in C++0x standard. For example constant methods cbegin() and cend() have been added to standard containers.

    0 讨论(0)
  • 2021-01-19 06:21

    Since foo is not const compiler is trying to use the non-const method. As a workaround you can do the following:

        Foo foo;
        const Foo& cFoo = foo;
        for(int i = 0; i < (int) cFoo.V().size(); ++i)
        cout << cFoo.V().at(i) << endl;
    
    0 讨论(0)
  • 2021-01-19 06:31

    Overload resolution does not take member accessibility into account, so an ideal overload candidate is chosen and then member accessibility is checked to see if the call is legal.

    The realistic workaround is:

    Foo foo;
    Foo const& foo_alias = foo;
    for (std::size_t i = 0; i != foo_alias.V().size(); ++i)
        cout << foo_alias.V().at(i) << endl;
    
    0 讨论(0)
提交回复
热议问题