2011-06-15 156 views
3

我需要在使用new創建類時調用函數。 目前我需要寫是這樣的:有沒有一種方法可以在創建類時自動調用函數

MyClass *myClassPointer = new MyClass(...); 
myFunction(myClassPointer); 

當MyClass的作爲本地對象myFunction的創建不能叫。 MyClass有至少2個具有不同參數的構造函數。有沒有辦法使它自動化,其他程序員不需要記住調用它。

我用相當古老的框架工作,myFunction用於維護而不打破它。

編輯

myFunction是應用主窗口的公共成員函數,女巫是在應用程序的所有代碼可見。但myFunction會被移出mainWindow類,如果需要的話,可將其更改爲全局函數。

我正在考慮myClass的頭文件中的某種宏,因爲這樣我就不需要檢查已經寫好的所有代碼,並添加這些修改。但我找不到任何解決方案。

在此先感謝您的任何想法和建議。

接受後。

問題是因爲MyClass的設計不好,而且它在框架中的使用。我接受了Mark的回答,因爲MyClass應該從一開始就由ClassFactory創建。

+0

myFunction是一項免費功能嗎? – 2011-06-15 14:46:17

+1

覆蓋默認的new和delete操作符,是一個選項嗎? – DumbCoder 2011-06-15 14:47:43

+0

@DumbCoder:在調用構造函數之前調用該函數。 – sharptooth 2011-06-16 06:49:05

回答

8

使用班級工廠而不是直接致電new。在返回指針之前,工廠可以撥打myFunction

+0

類工廠使定義派生類更加困難和費力。 – 2011-06-15 15:21:27

+0

@Alf,我看不出如何 - 你只需爲每個派生類創建一個新工廠。既然它不是原始問題定義的一部分,我會打電話給YAGNI。 – 2011-06-15 15:42:55

+0

在他的情況下,它至少有兩個工廠功能。一般來說,每個構造函數都有一個。對於每個班級來說,更一般的情況就是這樣,M * N。將它與單個宏進行比較。 – 2011-06-15 15:50:26

3

對象工廠函數是一種可能的解決方案,但它使定義派生類變得更加困難和費力:雖然簡單,但它非常非常具有侵入性。

如果你絕對必須這樣做,那麼實際的方法是這樣定義一個宏:

#define MYNEW(Type, args) myFunction(new Type args) 

,你讓myFunction回到它的指針ARG。你可以使用這樣的宏:

MyClass* myClassPointer = MYNEW(Type,(blah, blah, blah)); 

這解決了一半的問題,即如何擺脫冗餘。

另一半是如何使這個安全,以確保沒有人直接使用new,只有你的MYNEW宏。答案是,你不能,但是你可以直接使用new這樣的修改過於複雜和不切實際,以至於沒有人能夠無意中犯這樣的錯誤。爲此,您只需定義一個帶有額外參數的分配函數(因爲最簡單的分配函數允許在預先存在的存儲中創建對象,即將對象「放置」在存儲器中),這種分配函數被稱爲「放置新的」。

它可以是這樣的:

#include <stddef.h> 

// Support machinery: 
template< class Type > 
Type* myFunction(Type* p) { return p; } 

enum NewCallObfuscation {}; 
#define MY_NEW(Type, args) \ 
    myFunction(new((NewCallObfuscation*)0) Type args) 

// Usage:  
struct MyClass 
{ 
    void* operator new(size_t size, NewCallObfuscation*) 
    { 
     return ::operator new(size); 
    } 

    MyClass(int, int, int) {} 
}; 

int main() 
{ 
    //MyClass* p = new MyClass(1, 2, 3);  //!Nyet 
    MyClass* p = MY_NEW(MyClass,(1, 2, 3)); 
} 

話雖如此,呼籲通過new分配每一個成功構建對象的功能是一個非常特殊和非常不尋常的要求。我懷疑你試圖解決的問題要容易得多。也就是說,你問的是錯誤的東西。

乾杯& hth。,

相關問題