C++受保护/公共重载

foo*_*foo 4 c++ overloading protected public

我有一个这样的课:

class Foo
{
public:
    Foo()
    {
        for(int i = 0; i < 10; ++i)
            v.push_back(i);
    };
    const vector<double>& V() const {return v;};
protected:
    vector<double>& V() {return v;};
private:
    vector<double> v;
};
Run Code Online (Sandbox Code Playgroud)

然后是一段这样的代码:

Foo foo;
for(int i = 0; i < (int) foo.V().size(); ++i)
    cout << foo.V().at(i) << endl;
Run Code Online (Sandbox Code Playgroud)

但是,后者引发了一个编译错误,说V()调用是一个受保护的方法,而我只是想从中读取,而不是修改它.

我尝试了以下(但没有成功).

Foo foo;
const vector<double>& test = foo.V();
for(int i = 0; i < (int) test.size(); ++i)
    cout << test.at(i) << endl;
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助.

=====

谢谢大家的解释和解决方案!非常感谢!

Jur*_*aho 5

返回值不可能超载.当对象是非const时,将使用非const方法.可以通过以下方式指导编译器:

const vector<double>& test = const_cast<Foo const&>(foo).V();
Run Code Online (Sandbox Code Playgroud)

或者可能更好的解决方案是使常量方法具有不同的名称(例如:)ConstV.或者您可以添加此新方法并将当前方法保留在那里.此方法用于C++ 0x标准.例如恒定的方法cbegin()cend()已被添加到标准容器.

  • 你可能意味着`const_cast <Foo const&>(foo)`(`const_cast`需要一个指针或引用).更好的是使用`static_cast`. (2认同)

ild*_*arn 5

重载决策不考虑成员可访问性,因此选择理想的重载候选者,然后检查成员可访问性以查看调用是否合法.

现实的解决方法是:

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;
Run Code Online (Sandbox Code Playgroud)