Visual Studio允许不相关的类方法访问嵌套的私有类
Visual Studio allows unrelated class method to access nested private class?
我正在尝试在linux和windows上构建我的项目。该项目已经在windows上工作,但我在GCC上面临一个非常奇怪的错误。考虑下面的代码:
Class Base {
private:
MessageInfo *createMsg();
}
Class MessageInfo {
private:
class Message{
...
}
public:
Message *messages[MAX_NO_MESSAGES];
...
}
MessageInfo *Base::createMsg(){
...
MessageInfo *newMsg = new MessageInfo;
newMsg->messages[i] = new MessageInfo::Message();
...
}
现在的问题是,在Visual Studio的一切编译,但在GCC我得到以下错误:
*错误:Class MessageInfo::Message is private
我真的很惊讶,代码实际上在Visual Studio中编译,而不是在GCC中编译。有什么建议吗? ?
编辑:我想我必须用更好的方式问我的问题。我的问题是怎么可能在vs2005中编译这样的代码??我在VS2013中尝试了我的代码,它给了我与GCC相同的错误。所以我不是说代码是正确的!
不能在Visual Studio 2013中编译:
class MessageInfo {
class Message { };
public:
Message *messages[256];
};
class Base {
MessageInfo *createMsg();
};
MessageInfo *Base::createMsg() {
MessageInfo *newMsg = new MessageInfo;
newMsg->messages[0] = new MessageInfo::Message(); // won't compile
}
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
如您所料,错误是:
error C2248: 'MessageInfo::Message' : cannot access private class declared in class 'MessageInfo'
编译器是如此不同,我真的不知道为什么VS会允许编译,我使用过的任何编译器都会抛出编译错误。你这样做是对类的错误理解。如果你有
class Message {...};
private在MessageInfo中,那么你应该不能在类之外的任何地方访问它。我们只希望Message在MessageInfo类中可用,而不在其他地方可用。所以你不应该像在MessageInfo中那样返回一个Message*,你也不能像在main中那样访问Message()构造函数。这种编程方式是不允许的,否则它将完全违背封装的目的。如果您确实希望Message对任何人都可用,那么就将其设为公共,但通常情况下,类的内部工作原理是对用户隐藏起来的,这是一个很好的理由:用户不需要担心它。
根据egrunin的建议,我使用了他在评论中建议的代码。显然,你不能在Visual Studio 2013中编译该代码,但我成功地在我的机器上使用Visual Studio 2005编译了它。的完整代码使用:
// Test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
class MessageInfo {
class Message { };
public:
Message *messages[256];
};
class Base {
MessageInfo *createMsg();
};
MessageInfo *Base::createMsg() {
MessageInfo *newMsg = new MessageInfo;
newMsg->messages[0] = new MessageInfo::Message(); // won't compile
return newMsg;
}
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
我做错了什么吗??
p。S:
我尝试了Visual Studio 2010上的代码,我得到了无法访问在类'MessageInfo'错误中声明的私有类!!任何人都可以在Visual Studio 2005上编译这个代码,以便我知道VS 2005有什么问题????
- 无法访问嵌套类.类的使用无效
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- C++将结构传递给函数以访问嵌套结构
- 嵌套容器:为什么我无法访问堆栈队列顶部的堆栈?C++
- 通过 id 访问 QML 插槽中的嵌套对象(从 c++ 调用)
- 如何访问嵌套类的数据?
- 访问另一个类中的模板化嵌套类函数和对象
- 如何访问嵌套在命名命名空间中的未命名命名空间变量?
- 优雅地访问嵌套类中的数据
- 无法从多态嵌套类访问包含类的成员
- 嵌套的类成员变量不可访问.链表设置.V、下一个和新的问题
- 访问range_expression中的嵌套元素会返回不完整的映射(段错误)
- 如何通过迭代器访问向量中的嵌套对?
- 在 c++ 中访问嵌套字典unordered_map<字符串、void*>?
- Python和Ctypes访问带有嵌套结构的C 类
- 为什么 clang 不允许通过实例访问嵌套枚举类?
- 访问嵌套块中重新定义的变量
- C++对不同功能的私有嵌套访问
- 通过指向成员的指针对嵌套访问进行编译时评估期间出现 GCC 错误