在内部类中使用私有变量

use private variable in inner class

本文关键字:变量 内部类      更新时间:2023-10-16

我有一个容器类,里面有一个指针类。容器类有一个私有变量(myTreeSize(,指针类也需要它。我尝试使用参考或朋友,但它不起作用。也许有人有想法?

template <typename Key>
class myContainer{
class myPointer;
using littlePoint = myPointer;
private:
struct node{ 
//....
};
struct mylist{  
//....
};
mylist* tree{nullptr};
size_type myTreeSize{0};
public:
littlePoint find(int key) {
mylist *list_pos{find_list(key)}; //return list-position
node *node_pos {find_node(key)}; //return node-position
if (list_pos && node_pos) return littlePoint{list_pos, node_pos};
return end();
}
//.....methods
};
template <typename Key>
class myContainer<Key>::myPointer{
mylist *list_pos;
node *node_pos;
myContainer& parent; //<--- no private variables
friend class myContainer; //<-- no effect
explicit myPointer(mylist *list_pos=nullptr, node *node_pos = nullptr):
list_pos{list_pos}, node_pos{node_pos} {
//...
}
}

必须初始化myContainer& parent。引用不能保持未初始化状态。如果我修复了这个问题,那么您的代码就会编译,并且不需要friend声明,因为内部类已经可以完全访问外部类。

#include <iostream>
#include <string>
using namespace std;
template <typename Key>
class myContainer {
class myPointer;
private:
struct node {
//....
};
struct mylist {
//....
};
mylist* tree{ nullptr };
int myTreeSize{ 0 };
public:
};
template <typename Key>
class myContainer<Key>::myPointer {
mylist *list_pos;
node *node_pos;
myContainer& parent;
explicit myPointer(myContainer& parent, mylist *list_pos = nullptr, node *node_pos = nullptr) :
parent(parent), list_pos{ list_pos }, node_pos{ node_pos } {
parent.myTreeSize; // no problem!
}
};
int main()
{
myContainer<int> c;
}

演示

外部类中没有显示myPointer。 声明嵌套类不会自动创建该类的任何实例。同样,"内部"类也没有"外部"实例。

一个简单的例子,它实际实例化内部类并将对父类的引用传递给它:

template <typename T>
class A
{
class B;
B b_;
public:
A() : b_(*this) {}
};
template <typename T>
class A<T>::B
{
A & a_;
public:
B(A & a) : a_(a) {}
};