C++将隐藏的参数传递给类构造函数?
我想定义接受指针给它的类的父类作为参数,但它有可能以某种方式传递,而不需要直接传递如:C++将隐藏的参数传递给类构造函数?
class Child
{
public:
Child(Parent* hiddenArg);
};
class Parent
{
public:
Child myChild;
};
我知道这是奇怪,但我做我自己的信号/插槽实现和儿童将被定义的信号,但我希望得到家长这样我就可以使用它的事件调度...
你不能这样做它会自动执行,但是您需要做的只是在Parent构造函数中构造myChild
,如下所示:
Parent::Parent()
: myChild(this) // passing pointer to parent to child constructor
{
}
注意一些编译器会针对该代码发出警告:它认为您在Parent类完全构建之前使用了this
指针。只要你只有商店这个指针在Child的构造函数中,而不是就用吧,你没事。您可能合法地希望禁用该警告(尽管不要在项目范围内禁用警告 - 只是在受影响的区域周围)。
+1请注意,子构造函数不应该将接收到的指针用于除存储它之外的任何内容。传递一个指向非完全构造元素的指针(在这种情况下为'Parent')并存储它是正确的,但试图取消引用它是未定义的行为。 – 2010-05-06 14:44:45
myChild是否需要成为父类的指针,例如Child * myChild,否则这将不需要新建它 – 2010-05-06 14:46:55
你试过了吗?它应该与您发布的代码一起工作,其中'myChild'是普通成员。 – AshleysBrain 2010-05-06 14:52:37
class Child
{
public:
Child(Parent* hiddenArg = NULL);
};
如何以这种方式访问Parent? – stefaanv 2010-05-06 14:39:37
尽管如此,这并不会自动将指向父类的指针传递给它的子成员。 – AshleysBrain 2010-05-06 14:40:30
如果孩子是父母内部的私人嵌套类,那么这是可能的,但我强烈反对它。如果孩子是公共班级,那么没有办法做到这一点。孩子怎么可能知道什么对象(如果有的话)包含它?
在任何情况下,如果Child类对于父类是私有的,则可以从孩子的这个指针派生出父指针。类似如下:
class Parent {
public:
...
private:
class Child {
private:
Parent * GetParentPointer() {
return (Parent *)((char *)this - offsetof(Parent, m_child));
}
};
Child m_child;
};
而只是为了重申:不要这样做。没有人会在意你是否浪费了4或8字节的子指针,并且结果代码会更容易维护。
这是根据标准定义的所有行为吗? – AshleysBrain 2010-05-06 14:57:00
哇。我花了一分钟才意识到这确实可行,但这绝对是错误的解决方案。我不会倒退它,但是我的+1没有! – 2010-05-06 14:59:12
@AshleysBrain,我不认为'offsetof'是标准的一部分。 – 2010-05-06 14:59:42
使用工厂
class Parent
{
Parent();
Child* createChild()
{
return new Child(this,...);
}
}
需要所有'Child'类都在堆上,而不是成员。 – AshleysBrain 2010-05-06 14:54:38
如果你担心在堆上创建事物,你不应该在C++中进行尝试。这与其他一些解决方案(包括被接受的解决方案)相比,具有较少的警告和可读性,我需要更详细地描述实际问题以提供更好的解决方案 – 2010-05-06 18:51:09
这样一个丑陋的代码! – Andrey 2010-05-06 14:35:36
'Child'继承自'Parent'吗? – 2010-05-06 14:36:11
您是否想过Java嵌套类?他们有嵌套类的隐式访问。 – stefaanv 2010-05-06 14:36:17