【发布时间】:2013-09-05 12:11:37
【问题描述】:
在 C++/C++11 中,如何获取嵌套类实例化的“所有者”的引用/指针?例如:
class A
{
public:
friend class B;
class B
{
public:
Foo bar(int i) { return get_owner().x[...]; }
private:
A& get_owner()
{ // How to do this? Pseudo code:
return (A*)(this - offsetof(A, b));
}
};
B b;
};
注意:在我的例子中,A 不是standard layout type,因为它有私有和公共成员变量。
背景:我想为复杂属性实现“零成本”语法糖,它可以访问所属类中的数据结构并允许 A 的用户编写,例如,
A a;
...
x = a.nodes[5];
y = a.nodes.size();
for (auto n: a.nodes) // using a.nodes.begin() and a.nodes.end()
...
注意 2:我可能会使用肮脏的技巧来做到这一点,但有没有一种可移植的、符合标准的方法来做到这一点?
如果没有,我将不得不实现 B 以便我可以编写“a.nodes(5)”和“for (auto n: a.nodes())”,但这看起来相当难看。
编辑:我已经考虑过给 B 一个对 A 的引用,但是我不能为 A 使用默认的复制/移动构造函数/赋值运算符。在我的情况下这不会那么糟糕,但我好奇是否有其他解决方案。
【问题讨论】:
-
恐怕声明一个嵌套类,不会像你想的那样做。
-
在另一个内部定义的类之间没有任何关系。它与命名空间中的类几乎相同。
-
您不能在 C++ 中执行此操作,因为嵌套在其他类中的类没有对其外部类的引用。内部类的外部类与其说是所有者,不如说是一个命名空间。
-
@user1233963 在 C++11 中,
A和A::B之间存在某种程度的关系,因为A::B被视为成员 属于A,因此可以访问A的私有成员。 -
@Oswald:看起来不像是真的ideone.com/ntsSnO
标签: c++ c++11 nested-class