2011-06-15 89 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。,

相关问题