2010-12-09 99 views
0

我有以下访问另一个类的成员

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类功能使指针“学生* 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已经设置为指向一个二叉树中的一个节点,只需让我的哈希表也指向那里。)感谢您的帮助。

+2

多么可怕的代码。 – ruslik 2010-12-09 22:39:00

+1

你为什么要在另一个班级中定义一个班级? – robert 2010-12-09 22:40:43

回答

1

使用friend是可疑的。

典型的面向对象编程规定链表容器类只能处理指向类对象的指针,不应该知道或处理类对象本身内的任何东西。

如果所包含的类确实需要公开关于它自己(即它的任何成员)的信息,它应该为此提供公共访问器函数。

2

在评论你说:

在我能想到的...我试图让一个指针一类指向另一个指针在不同的类中最简单的术语。

要回答这个问题:内部类与外部类没有特殊关系。例如,book类中的student实例没有直接访问其“包含”类的方法。

为此,您必须将指向包含book类的指针传递给student的构造函数,并将其存储在student内的实例变量中。

但是,这有一个很大的警告:当student实例持有指向包含book类的指针时,该指针可能会失效。例如,如果您将book实例存储在类似std::vector的容器中,则该向量可能会重新分配内存,从而使指向vector内的book的指针无效。

如果您可以保证book不会被存储在STL容器(或其他任何可以移动的地方),那么这种方法可以工作。

我仍然会重新考虑整体方法,因为以这种方式实例存储指针似乎很脆弱。可能有一种基于组合的方法可行。

0

我同意其他人评论了关于代码,所以我就不再重复了,只是指向无效的语法代码:

public: 
    student book::*currentRoot = &book::currentRoot; 

1)成员指针是不是你想要的,它应该是:

public: 
    book::student* book::*currentRoot; 

2)您不能在类定义中分配给非静态成员。它只允许用于整型的静态成员。但你可以指定它在什么地方,你有一个对象:

void foo() 
{ 
    linkedList l; 
    l.currentRoot = &book::currentRoot; 
}