我可能错过了一些非常简单的事情,但如果有人能指出我正确的方向,我将非常感激。
我有两个类: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的链接列表?
如果问题啰嗦和天真,我道歉。如果需要,我很乐意进一步澄清。答案 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
的生命周期。