- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我可能遗漏了一些非常简单的东西,但如果有人能指出正确的方向,我将不胜感激。
我有 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/
我是一名优秀的程序员,十分优秀!