В 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;
};
Примечание: В моем случае, А неstandard layout type, потому что она имеет частные и публичные переменные-члены.
фона: Я хотел бы реализовать «нулевой стоимости» синтаксически сложных свойств, доступ к структурам данных в имущего класса и которые позволяют пользователям А писать, например,
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. Это было бы не так плохо в моем случае, Любопытно, есть ли другое решение.
Я боюсь объявить вложенный класс, не делает того, что, по вашему мнению, делает. –
Классы, определенные одним внутри другого, не имеют между ними отношения. Это почти то же самое, что и класс внутри пространства имен. – user1233963
Вы не можете сделать это на C++, потому что классы, вложенные в другие классы, не имеют ссылок на их внешние классы. Внешний класс для внутреннего класса скорее является пространством имен, чем владельцем. – dasblinkenlight