访问另一个类成员

时间:2010-12-09 22:35:25

标签: c++

我有以下

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已设置为指向二叉树中的节点。只需要将我的哈希表也指向那里。)感谢您的帮助。

3 个答案:

答案 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;
}