如何与私人嵌套成为朋友 class
How to befriend private nested class
我以为我可以做到:
class TestA
{
private:
class Nested
{
};
};
class TestB
{
public:
friend class TestA;
friend class TestA::Nested;
};
但是我得到一个错误:
Error C2248 'TestA::Nested': cannot access private class declared in class
有没有办法与私有嵌套 class 交朋友?我该怎么做?
我在 MSVC 2017 (C++17) 中尝试编译 MSVC 6 项目时遇到此错误。我想那时候它起作用了。
您正在尝试在 TestB
中使用 TestA
的 private
嵌套 class,那么您应该将 TestB
声明为 friend
在 TestA
。例如
class TestA
{
private:
class Nested
{
};
friend class TestB; // allow TestB to access the private members of TestA
};
与您访问任何其他私人物品的方式相同。你需要反过来的友谊:
class TestA
{
friend class TestB; // <== this
private:
class Nested
{
};
};
class TestB
{
public:
friend class TestA;
friend class TestA::Nested; // <== now we're a friend of TestA, so we can access it
};
这样做就可以了:
class TestA {
friend class TestB;
private:
class Nested {};
};
class TestB {
public:
friend class TestA::Nested;
};
说明:TestA
自己有责任将其内部结构的访问权限授予其他人。想象一下,任何 class
都可以侵入性地使用友谊来访问其他 类 的内部结构(来自图书馆等),这将为任意破坏封装打开大门。
只需注释掉 friend class TestA::Nested;
行,如下所示:
class TestA
{
private:
class Nested
{
};
};
class TestB
{
public:
friend class TestA;
// friend class TestA::Nested;
};
由于 TestA::Nested
具有与 TestA
相似的作用域,TestA::Nested
的方法可以访问 TestB 的 private/protected 个成员。
我以为我可以做到:
class TestA
{
private:
class Nested
{
};
};
class TestB
{
public:
friend class TestA;
friend class TestA::Nested;
};
但是我得到一个错误:
Error C2248 'TestA::Nested': cannot access private class declared in class
有没有办法与私有嵌套 class 交朋友?我该怎么做?
我在 MSVC 2017 (C++17) 中尝试编译 MSVC 6 项目时遇到此错误。我想那时候它起作用了。
您正在尝试在 TestB
中使用 TestA
的 private
嵌套 class,那么您应该将 TestB
声明为 friend
在 TestA
。例如
class TestA
{
private:
class Nested
{
};
friend class TestB; // allow TestB to access the private members of TestA
};
与您访问任何其他私人物品的方式相同。你需要反过来的友谊:
class TestA
{
friend class TestB; // <== this
private:
class Nested
{
};
};
class TestB
{
public:
friend class TestA;
friend class TestA::Nested; // <== now we're a friend of TestA, so we can access it
};
这样做就可以了:
class TestA {
friend class TestB;
private:
class Nested {};
};
class TestB {
public:
friend class TestA::Nested;
};
说明:TestA
自己有责任将其内部结构的访问权限授予其他人。想象一下,任何 class
都可以侵入性地使用友谊来访问其他 类 的内部结构(来自图书馆等),这将为任意破坏封装打开大门。
只需注释掉 friend class TestA::Nested;
行,如下所示:
class TestA
{
private:
class Nested
{
};
};
class TestB
{
public:
friend class TestA;
// friend class TestA::Nested;
};
由于 TestA::Nested
具有与 TestA
相似的作用域,TestA::Nested
的方法可以访问 TestB 的 private/protected 个成员。