2010-05-06 145 views
1

我想定义接受指针给它的类的父类作为参数,但它有可能以某种方式传递,而不需要直接传递如:C++将隐藏的参数传递给类构造函数?

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

class Parent 
{ 
public: 
    Child myChild; 
}; 

我知道这是奇怪,但我做我自己的信号/插槽实现和儿童将被定义的信号,但我希望得到家长这样我就可以使用它的事件调度...

+0

这样一个丑陋的代码! – Andrey 2010-05-06 14:35:36

+0

'Child'继承自'Parent'吗? – 2010-05-06 14:36:11

+0

您是否想过Java嵌套类?他们有嵌套类的隐式访问。 – stefaanv 2010-05-06 14:36:17

回答

10

你不能这样做它会自动执行,但是您需要做的只是在Parent构造函数中构造myChild,如下所示:

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

注意一些编译器会针对该代码发出警告:它认为您在Parent类完全构建之前使用了this指针。只要你只有商店这个指针在Child的构造函数中,而不是就用吧,你没事。您可能合法地希望禁用该警告(尽管不要在项目范围内禁用警告 - 只是在受影响的区域周围)。

+0

+1请注意,子构造函数不应该将接收到的指针用于除存储它之外的任何内容。传递一个指向非完全构造元素的指针(在这种情况下为'Parent')并存储它是正确的,但试图取消引用它是未定义的行为。 – 2010-05-06 14:44:45

+0

myChild是否需要成为父类的指针,例如Child * myChild,否则这将不需要新建它 – 2010-05-06 14:46:55

+1

你试过了吗?它应该与您发布的代码一起工作,其中'myChild'是普通成员。 – AshleysBrain 2010-05-06 14:52:37

0
class Child 
{ 
public: 
    Child(Parent* hiddenArg = NULL); 
}; 
+0

如何以这种方式访问​​Parent? – stefaanv 2010-05-06 14:39:37

+0

尽管如此,这并不会自动将指向父类的指针传递给它的子成员。 – AshleysBrain 2010-05-06 14:40:30

2

如果孩子是父母内部的私人嵌套类,那么这是可能的,但我强烈反对它。如果孩子是公共班级,那么没有办法做到这一点。孩子怎么可能知道什么对象(如果有的话)包含它?

在任何情况下,如果Child类对于父类是私有的,则可以从孩子的这个指针派生出父指针。类似如下:

class Parent { 
public: 
    ... 

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

    Child m_child; 
}; 

而只是为了重申:不要这样做。没有人会在意你是否浪费了4或8字节的子指针,并且结果代码会更容易维护。

+1

这是根据标准定义的所有行为吗? – AshleysBrain 2010-05-06 14:57:00

+0

哇。我花了一分钟才意识到这确实可行,但这绝对是错误的解决方案。我不会倒退它,但是我的+1没有! – 2010-05-06 14:59:12

+0

@AshleysBrain,我不认为'offsetof'是标准的一部分。 – 2010-05-06 14:59:42

1

使用工厂

class Parent 
{ 
    Parent(); 

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

需要所有'Child'类都在堆上,而不是成员。 – AshleysBrain 2010-05-06 14:54:38

+0

如果你担心在堆上创建事物,你不应该在C++中进行尝试。这与其他一些解决方案(包括被接受的解决方案)相比,具有较少的警告和可读性,我需要更详细地描述实际问题以提供更好的解决方案 – 2010-05-06 18:51:09

相关问题