我想定義接受指針給它的類的父類作爲參數,但它有可能以某種方式傳遞,而不需要直接傳遞如:C++將隱藏的參數傳遞給類構造函數?
class Child
{
public:
Child(Parent* hiddenArg);
};
class Parent
{
public:
Child myChild;
};
我知道這是奇怪,但我做我自己的信號/插槽實現和兒童將被定義的信號,但我希望得到家長這樣我就可以使用它的事件調度...
我想定義接受指針給它的類的父類作爲參數,但它有可能以某種方式傳遞,而不需要直接傳遞如: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