C ++:如何使用不同的类函数来操作我的类成员变量

时间:2013-01-27 22:30:06

标签: c++ oop object external function-overriding

我可能错过了一些非常简单的事情,但如果有人能指出我正确的方向,我将非常感激。

我有两个类:A和B.A有一组数据结构和函数可以修改它们(对于一个假设的例子,比如对数据结构添加,删除,插入等)。 B有一组函数,用于指定在A中修改数据结构的

为了可扩展性,继承B以反映A的数据结构上的不同可能行为。 B的一个实现可以选择添加到A的数据结构的开头,从末尾删除,等等。另一个实现可能会添加到结尾,从头开始删除,依此类推。

我在创建A期间传递基类B的对象,因此通用的addNode(),deleteNode()和A的其他函数实际上可以查找在创建期间传递给它的特定类型的B对象并参考其在B中的实施,了解应采取的行动。

在下面的假设示例中,所关注的数据结构是双向链表。在我的问题中,数据结构本身不是问题。我担心如何在B的派生类中调用正确的方法来修改A中的数据结构。

A类:

class A
{
    static A create(B bObj);  // returns an A object after calling the constructor
    void addNode(int);
    void deleteNode();
    ...
private:
    struct myNode
    {
        int value;
        myNode *next;
        myNode *prev;
    }
    myNode *head;
    myNode *tail;
}

B组:

class B
{
    virtual void addNode(int);
    virtual void deleteNode();
    ...
}

Class ChildB1:

class ChildB1
{
    void addNode(int)
    {
        // code for add to the front
    }
    void deleteNode()
    {
        // code for delete from the back
    }
}

Class ChildB2:

class ChildB2
{
    void addNode(int)
    {
        // code for add to the back
    }
    void deleteNode()
    {
        // code for delete from the front
    }
}

我遇到的问题是如何让一个子类B访问我正在操作的A的当前对象?假设在使用create()方法创建A(aObj)对象时,我传递了对象ChildB2的引用。

B *bObj = new ChildB2();
A aObj = A.create(*bObj);

现在当我调用aObj.add()时,我希望它调用ChildB2类的add()方法,以便它可以在A中的链表上操作并将其添加到列表的后端。但是ChildB2类的add()函数如何访问aObj的链接列表?

如果问题啰嗦和天真,我道歉。如果需要,我很乐意进一步澄清。

1 个答案:

答案 0 :(得分:0)

B添加为A的朋友。

class A
{
   friend class B;
   // the rest
};

由于友谊未被继承,B必须明确向其继承人提供A个私人部分的访问权。

class B
{
  protected:
    // since A::myNode is private, redeclare it here
    // for heirs
    typedef A::myNode myNode;

    // access to A parts
    void getAParts (A*, myNode*** head, myNode*** tail)
    {
      *head = &a->head;
      *tail = &a->tail;
    }
    // the rest

};

一些注意事项:您应该通过引用将B传递给create,而不是按值传递,否则您的ChildB2对象将切片。您还需要以某种方式管理B的生命周期。