C++ 常量和非常量getter:C2248:无法访问类中声明的私有成员
我有一个类,它实现了对C++ 常量和非常量getter:C2248:无法访问类中声明的私有成员,c++,constants,C++,Constants,我有一个类,它实现了对std::vector的getter。派生类可以更改向量的内容,而任何其他类都可以读取它(或者在我的情况下复制),但不能更改它 使用VisualStudio2010进行SSCCE(但也应使用任何其他工具进行编译) 所以在基类中,我实现了如下getter: #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> #include <string> #in
std::vector
的getter。派生类可以更改向量的内容,而任何其他类都可以读取它(或者在我的情况下复制),但不能更改它
使用VisualStudio2010进行SSCCE(但也应使用任何其他工具进行编译)
所以在基类中,我实现了如下getter:
#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;
}
我真的不明白这有什么错,为什么编译器不采用公共版本,即const,而是坚持使用非const
即使我将变量更改为const&s
(在这种情况下没有帮助),我仍然会得到相同的错误
更新:
编辑了用于调用常量和非常量函数的SSCCE。在这种情况下,它应该是
const Y y;
在调用函数的const
版本的Z::my_函数中。
或者直接强制转换到常量
,如
std::vector<std::string> s = const_cast<const Y&>(y).getChilds();
std::vector s=const_cast(y).getChilds();
您的案例不起作用,因为只有在重载解析后才会应用访问检查,因此将在调用中选择非常量重载,因为它具有最佳匹配。Usestd::vector s=static_cast(y).getChilds()相反,我从不建议使用语法重载,更不用说在常量中使用重载了。我知道这并不能回答您的问题-这就是为什么我将其作为注释来写。一个简单的解决方案是给函数赋予不同的名称,但由于您提供了对子类的无限制访问,所以getter本身是有问题的,最简单的解决方案是使成员变量受到保护。@molbdnilo,根据我的经验,我发现getter更有用。它们通常会得到优化,但当我需要更改某些内容(如日志访问等)时,我根本不需要修改代码。@molbdnilo,Direct access也不允许我在以后更改实现,因为这样我就有了直接耦合。但这难道不意味着我不能调用任何非常量函数吗?毕竟,在某些情况下,类可能需要更新其内部状态(在SSCCE中没有显示)。无论如何,我认为编译器可以自己推断出来。如果我必须添加这个难看的强制转换,那么我也可以使用一个人工不同的函数名,这使代码更易于阅读。@Devlus它不能,因为非常量版本是最好的匹配,但它是受保护的。我想我现在理解了这个问题(尽管我不喜欢它:)。好啊谢谢
std::vector<std::string> s = const_cast<const Y&>(y).getChilds();