我想定义一个接受指向它的父类的指针作为参数的类,但是可以以某种方式传递它而不需要直接传递它,例如:
class Child
{
public:
Child(Parent* hiddenArg);
};
class Parent
{
public:
Child myChild;
};
我知道这很奇怪,但是我正在制作自己的Signal / Slot实现,Child会定义一个信号,但我想得到父母,所以我可以使用它的事件调度程序......
答案 0 :(得分:10)
你不能自动完成,但你需要做的就是在Parent构造函数中构造myChild
,如下所示:
Parent::Parent()
: myChild(this) // passing pointer to parent to child constructor
{
}
注意一些编译器会发出该代码的警告:它认为在完全构造Parent类之前你正在使用this
指针。只要你只存储指针在Child构造函数中并且不使用它,你就可以了。你可能合法地想要禁用警告(尽量不要在项目范围内禁用警告 - 只是在受影响的区域周围)。
答案 1 :(得分:2)
如果Child是父级内部的私有嵌套类,那么这是可能的,但我强烈反对它。如果Child是公共课,那么就没有办法做到这一点。 Child怎么可能知道哪个对象(如果有的话)包含它?
在任何情况下,如果Child类对父类是私有的,则可以从子指针的this指针派生父指针。如下所示:
class Parent {
public:
...
private:
class Child {
private:
Parent * GetParentPointer() {
return (Parent *)((char *)this - offsetof( Parent, m_child ));
}
};
Child m_child;
};
只是重申:不要这样做。如果你在子节点内的额外指针上“浪费”4或8个字节,没有人会关心,并且生成的代码将更易于维护。
答案 2 :(得分:1)
使用工厂
class Parent
{
Parent();
Child* createChild()
{
return new Child(this,...);
}
}
答案 3 :(得分:0)
class Child
{
public:
Child(Parent* hiddenArg = NULL);
};