2

我可能遗漏了一些非常简单的东西,但如果有人能指出我正确的方向,我将不胜感激。

我有 2 个类:A 和 B。A 有一组数据结构和修改它们的函数(举个假设的例子,比如向数据结构添加、删除、插入等)。B 具有一组函数,这些函数指定如何在 A 中修改数据结构。

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

我在创建A的过程中传递了一个基类B的对象,这样A的泛型addNode()、deleteNode()等函数实际上可以查找到创建过程中传递给它的特定类型的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();
    ...
}

ChildB1 类:

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

ChildB2 类:

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

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

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

现在我在调用aObj.add()的时候,希望它调用ChildB2类的add()方法,这样它就可以对A中的链表进行操作,并将其添加到链表的后端。但是 ChildB2 类的 add() 函数是如何访问 aObj 的链表的呢?

如果这个问题冗长而幼稚,我深表歉意。如果需要,我很乐意提供进一步的说明。

4

1 回答 1

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给,否则您的对象将被切片。您还需要以某种方式管理生命周期。createChildB2B

于 2013-01-27T23:28:11.280 回答