gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:15 25 4
gpt4 key购买 nike

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

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com