我有以下
class book
{
friend class linkedList;
private:
class student
{
friend class book;
string name;
string number;
string gpa;
student *left;
student *right;
student(string name1, string number1, string gpa1,
student *left1 = NULL, student *right1 = NULL)
{
name = name1;
number = number1;
gpa = gpa1;
left = left1;
right = right1;
}
};
int count;
student *root;
ofstream recordBook;
void _add(student *&, string, string, string);
void _display_book(student *);
bool _search_for_name(string, string&, string&);
bool _edit_entry(string &name, string &edited_number);
void _del_person(student *&, string);
void _save(student *root);
void _del_Tree(student *);
public:
student *currentRoot;
book(void); //Constructor
~book(void);//Destructor
void add(string entry_name, string telephone_number, string gpa);
void display_book();
bool search_for_name(string find_name);
bool edit_entry(string entered_name, string edited_number);
void del_person(string entry_name);
void save();
void load_data();
};
class linkedList
{
friend class book;
int someInt;
struct node
{
public:
string key;
node *link;
node *link2;
} *pointer;
public:
student book::*currentRoot = &book::currentRoot;
linkedList();
~linkedList();
void append(string &str);
void del(string &str);
void display();
};
我需要从我的linkedList类函数中创建一个指向“student * currentRoot”的指针。
void linkedList::append(string &str)
{
node *q, *t;
if(pointer == NULL)
{
pointer = new node;
pointer->key = str;
pointer->link = NULL;
pointer->link2 = currentRoot;
someInt += 1;
}
else
{
q = pointer;
while(q->link != NULL)
{
q = q->link;
}
t = new node;
t->key = str;
t->link = NULL;
q->link = t;
someInt += 1;
}
}
在linkedList :: append中我需要指向link2指向currentRoot所指向的位置。我怎样才能做到这一点? (currentRoot已设置为指向二叉树中的节点。只需要将我的哈希表也指向那里。)感谢您的帮助。
答案 0 :(得分:2)
你在评论中说:
用最简单的术语我可以想到......我试图在一个类中获得指向另一个类中的另一个指针。
回答这个问题:内部类与外部类没有特殊关系。例如,student
类中的book
实例无法直接访问其“包含”类。
要执行此操作,您必须将指向包含book
类的指针传递给student
的构造函数,并将其存储在student
中的实例变量中。
但是,这有一个很大的警告:当student
实例保存指向包含book
类的指针时,该指针可能变为无效。例如,如果要将book
个实例存储在像std::vector
这样的容器中,则该向量可能会重新分配内存,从而使book
内的vector
指针无效。 / p>
如果您可以保证book
不会存储在STL容器中(或任何可以移动它的地方),那么这种方法可以正常工作。
我仍然会重新考虑整体方法,因为实例以这种方式存储指针似乎很脆弱。可能有一种基于组合的方法可行。
答案 1 :(得分:1)
使用friend
是可疑的。
典型的面向对象编程规定链表容器类应该只处理类对象的指针,并且不应该知道或处理类对象本身内的任何内容。
如果包含的类确实需要公开有关其自身的信息(即其任何成员),它应该提供公共访问器功能。
答案 2 :(得分:0)
我同意其他人对代码的评论,所以我不会重复它,只是指出代码中的语法无效:
public:
student book::*currentRoot = &book::currentRoot;
1)指向成员的指针不是你想要的,应该是:
public:
book::student* book::*currentRoot;
2)您无法在类定义中分配给非静态成员。它只允许整数类型的静态成员。但是你可以在你拥有对象的地方分配它:
void foo()
{
linkedList l;
l.currentRoot = &book::currentRoot;
}