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

C++将隐藏的ARG传递给类构造函数?,c++,C++,我想定义一个类,该类接受指向其父类的指针作为参数,但是否可以在不需要直接传递的情况下以某种方式传递它,例如: class Child { public: Child(Parent* hiddenArg); }; class Parent { public: Child myChild; }; 我知道这很奇怪,但我正在制作我自己的信号/插槽实现,子项将是一个信号定义的,但我想得到父项,这样我就可以使用它的事件调度器…你不能自动完成,但你需要做的就是在父项构造函数中像这样构造我的子项

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

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

class Parent
{
public:
   Child myChild;
};

我知道这很奇怪,但我正在制作我自己的信号/插槽实现,子项将是一个信号定义的,但我想得到父项,这样我就可以使用它的事件调度器…

你不能自动完成,但你需要做的就是在父项构造函数中像这样构造我的子项:

class Child
{
public:
   Child(Parent* hiddenArg = NULL);
};
Parent::Parent()
  : myChild(this)   // passing pointer to parent to child constructor
{
}

请注意,一些编译器会对该代码发出警告:它认为您在完全构造父类之前使用了this指针。只要您只将指针存储在子构造函数中而不使用它,就可以了。您可以合法地禁用警告,但不要在整个项目范围内禁用警告-仅在受影响的区域附近。

您不能自动执行此操作,但您需要做的只是在父构造函数中构造myChild,如下所示:

Parent::Parent()
  : myChild(this)   // passing pointer to parent to child constructor
{
}

请注意,一些编译器会对该代码发出警告:它认为您在完全构造父类之前使用了this指针。只要您只将指针存储在子构造函数中而不使用它,就可以了。您可以合法地禁用警告,但不要在整个项目范围内禁用警告-仅在受影响的区域附近。

如果子级是父级内部的私有嵌套类,则这是可能的,但我强烈建议不要禁用。如果Child是一个公共类,那么就没有办法做到这一点。孩子们怎么可能知道包含它的对象呢

在任何情况下,如果子类是父类专用的,则可以从子类的this指针派生父类指针。如下所示:

class Parent {
public:
     ...

private:
    class Child {
    private:
        Parent * GetParentPointer() {
            return (Parent *)((char *)this - offsetof( Parent, m_child ));
        }
    };

    Child m_child;
 };

重申一下:不要这样做。没有人会在意您是否在子级中的额外指针上浪费了4或8个字节,并且生成的代码将更易于维护。

如果子级是父级中的私有嵌套类,则这是可能的,但我强烈建议不要这样做。如果Child是一个公共类,那么就没有办法做到这一点。孩子们怎么可能知道包含它的对象呢

在任何情况下,如果子类是父类专用的,则可以从子类的this指针派生父类指针。如下所示:

class Parent {
public:
     ...

private:
    class Child {
    private:
        Parent * GetParentPointer() {
            return (Parent *)((char *)this - offsetof( Parent, m_child ));
        }
    };

    Child m_child;
 };
重申一下:不要这样做。没有人会在意您是否在子级中的额外指针上浪费了4或8个字节,因此生成的代码将更易于维护。

使用工厂

class Parent
{ 
  Parent();

  Child* createChild()
  {
    return new Child(this,...);
  }
}
使用工厂

class Parent
{ 
  Parent();

  Child* createChild()
  {
    return new Child(this,...);
  }
}


子类是否继承自父类?您是否在考虑Java嵌套类?它们具有嵌套类的隐式访问权限。子对象不从父对象继承。@JP:这会使父对象和子对象的使用混淆。根据我的经验,这些术语用于描述继承层次结构中的类。像Container和Contained这样的东西可以更好地描述这个问题,并且不会让人感到厌烦。子类是否继承自父类?您是否在考虑Java嵌套类?它们具有嵌套类的隐式访问权限。子对象不从父对象继承。@JP:这会使父对象和子对象的使用混淆。根据我的经验,这些术语用于描述继承层次结构中的类。像Container和Contained这样的东西可以更好地描述问题,而不会让人感到厌烦。您如何通过这种方式访问父类?这不会自动将指向父类的指针传递给其子成员。您如何通过这种方式访问父类?这不会自动将指向父类的指针传递给其子成员,尽管如此。+1请注意,子构造函数不应将接收到的指针用于存储它以外的任何事情。在这种情况下,将指针传递到未完全构造的元素父级并将其存储是正确的,但尝试取消引用它是未定义的行为。myChild是否需要是父类(如Child*myChild)中的指针,或者不需要新建就可以工作?是否尝试过?它应该与您发布的代码一起工作,其中myChild是一个普通成员。+1请注意,子构造函数不应该将接收到的指针用于存储它以外的任何事情。在这种情况下,将指针传递到未完全构造的元素父级并将其存储是正确的,但尝试取消引用它是未定义的行为。myChild是否需要是父类(如Child*myChild)中的指针,或者不需要新建就可以工作?是否尝试过?它应该与你所发布的代码一起工作,其中MyBead是一个普通成员。虽然所有的子类都在堆中,而不是成员。如果你担心堆上创建的东西,你就不应该涉足C++。与这里建议的其他一些解决方案(包括已被接受的解决方案)相比,该解决方案的警告更少,可读性更高。我需要对实际问题进行更详细的描述,以找到更好的解决方案要求所有子类都是
但是,如果你担心在堆上创建东西,你就不应该涉足C++。与这里建议的其他一些解决方案(包括已被接受的解决方案)相比,该解决方案的警告更少,可读性更高。我需要对实际问题进行更详细的描述,以找到更好的解决方案。这都是根据标准定义的行为?哇。我花了一分钟的时间才意识到这实际上可能有效,但这绝对是错误的解决方案。我不会投反对票,但我不会投+1@AshleysBrain,我不认为offsetof是标准的一部分。offsetof是ANSI C宏。无论如何,我建议不要使用它两次。但我还是觉得很酷;向上投票这意味着确保我们的工作。这都是根据标准定义的行为吗?哇。我花了一分钟的时间才意识到这实际上可能有效,但这绝对是错误的解决方案。我不会投反对票,但我不会投+1@AshleysBrain,我不认为offsetof是标准的一部分。offsetof是ANSI C宏。无论如何,我建议不要使用它两次。但我还是觉得很酷;这意味着确保我们的工作。