2010-05-06 142 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

相關問題