我有一个实现#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
class X
{
public:
inline std::vector<std::string> const &getChilds(void) const
{
return mChilds;
}
void mutateInternal(void)
{
mState != mState;
}
protected:
inline std::vector<std::string> &getChilds(void)
{
return mChilds;
}
private:
std::vector<std::string> mChilds;
bool mState;
};
// Now in the derived class
class Y : public X
{
public:
Y(void)
{
std::vector<std::string> &childs = getChilds();
childs.push_back("Test");
}
};
// In the non derived class:
class Z
{
public:
void myfunction(void)
{
Y y;
std::vector<std::string> s = y.getChilds();
if(s.size() == 0)
y.mutateInternal();
}
};
int main(int argc, char *argv[])
{
return 0;
}
的getter的类。允许派生类更改向量的内容,而任何其他类可以读取它(或在我的情况下复制),但不能更改它。
SSCCE与Visual Studio 2010(但也应与其他任何编译)。
所以在基类中我实现了这样的getter:
1>junk.cpp(49): error C2248: "X::getChilds": cannot access private member declared in class.
1> junk.cpp(18): Siehe Deklaration von 'X::getChilds'
1> junk.cpp(10): Siehe Deklaration von 'X'
但是我收到了错误
const &s
我并没有真正意识到这有什么问题以及编译器为什么不采用const的公共版本而是坚持使用非const。
即使我将变量更改为{{1}}(在这种情况下也没有帮助),我仍然会遇到同样的错误。
编辑SSCCE以调用const和非const函数。
答案 0 :(得分:4)
在这种情况下应该是
const Y y;
在Z::my_function
中,用于调用const
版本的函数。
Live
或者只是转换为const Y
,例如
std::vector<std::string> s = const_cast<const Y&>(y).getChilds();
您的情况不起作用,因为只有在重载解析后才会应用访问检查,因为它具有最佳匹配,所以会选择调用y.getChilds()
非常量重载。