2010-12-09 104 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; 
}