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

标签 c++ oop object external overriding

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

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

为了可扩展性,继承了B以反射(reflect)在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 的子类访问我正在操作的 A 的当前对象?比方说,在使用 create() 方法创建 A (aObj) 的对象时,我传递了对对象 ChildB2 的引用。

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

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

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

最佳答案

B添加为A的好友。

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

由于友元不能继承,B 必须明确为其继承人提供访问A 私有(private)部分的权限。

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 的生命周期。

关于C++:如何让不同的类函数操作我的类成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14553082/

相关文章:

java - 如何在没有循环且仅使用foldLeft的情况下获得minVal?

javascript - 使用变量动态访问对象属性

JavaScript/TypeScript - 对象仅分配可用属性

c++ - 升级 XCode 后出现 "Parse issue: Unknown type name"错误

c++ - 使用 dynamic_cast 向下转型返回 null

android - OpenGL 3.0 ES 中的错误纹理渲染

python - 从 python 中获取容器/父对象

c++ - 虚拟函数的STK回调振荡器问题

php - 如何从同一个类的静态方法调用非静态方法?

php - 无法解析的依赖解析 [Parameter #0 [ <required> $name ]]