Visual Studio允许不相关的类方法访问嵌套的私有类

Visual Studio allows unrelated class method to access nested private class?

本文关键字:嵌套 访问 类方法 不相关 Visual Studio      更新时间:2023-10-16

我正在尝试在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有什么问题????