C ++将隐藏的arg传递给类构造函数?

时间:2010-05-06 14:32:37

标签: c++

我想定义一个接受指向它的父类的指针作为参数的类,但是可以以某种方式传递它而不需要直接传递它,例如:

class Child
{
public:
   Child(Parent* hiddenArg);
};

class Parent
{
public:
   Child myChild;
};

我知道这很奇怪,但是我正在制作自己的Signal / Slot实现,Child会定义一个信号,但我想得到父母,所以我可以使用它的事件调度程序......

4 个答案:

答案 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);
};