【问题标题】:Accessing the private data members of a struct that is in a namespace访问命名空间中结构的私有数据成员
【发布时间】:2014-04-29 15:15:30
【问题描述】:

我正在尝试从朋友类访问结构的私有数据成员,如下所示。所有代码都在一个 cpp 文件中:

namespace Foo
{
    struct TestStruct
    {
        friend class Bar;

        private:

            int _testNum;
    };
}

class Bar
{
    public:

        Bar();

    private:

        Foo::TestStruct _testStructObj;
};

Bar::Bar()
{
    _testStructObj._testNum = 10; //Cannot modify _testNum because it is private
}

在编译时,我收到一条错误消息,指出结构 TestStruct 中的 _testNum 是私有的,因此无法访问。在尝试了不同的事情并在网上搜索后,我最终决定删除命名空间并编译代码。当结构体定义在命名空间中时,为什么我不能从友元类访问结构体的私有数据成员?

【问题讨论】:

  • 注意名称的前导下划线;它们大多保留给实现使用——所以你不应该使用它们。

标签: c++ namespaces


【解决方案1】:

当说friend class Bar; 时,它仍然在Foo 命名空间内,但你的类Bar 在外面。使用一元作用域解析运算符来指定 Bar 在全局命名空间中而不是在 Foo 中:

friend class ::Bar;

您还必须在 TestStruct 之前转发声明或定义 Bar

class Bar;

namespace Foo {
    ...
}

class Bar {
    ...
};

【讨论】:

  • 它有效,谢谢。我之前尝试添加前向声明,但似乎我只是缺少范围解析运算符。你能回答我吗?我仍在玩弄代码,我意识到如果您删除结构中的私有访问说明符、前向声明和范围运算符,代码就可以工作。你说因为 Bar 在命名空间之外它不应该工作,但为什么这工作?
  • @DanielJG,它在命名空间之外不起作用的唯一原因是因为它在命名空间内寻找一个类作为朋友。这个问题只是因为友元类声明的必要性而出现的。对于公共数据成员,friend class Bar; 可能根本不存在,因为它不会产生影响,Bar 将能够访问公共成员,无论它是否是朋友。
  • 哦,我现在明白了。我刚刚删除了朋友类声明,发现在这种情况下不需要友谊来访问结构的成员。再次感谢。
猜你喜欢
  • 2023-03-22
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
相关资源
最近更新 更多