有没有办法在new创建类时自动调用函数

时间:2011-06-15 14:44:31

标签: c++

每当使用new创建类时,我都需要调用函数。 目前我需要写这样的东西:

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

当MyClass创建为本地对象时,无法调用myFunction。 MyClass至少有2个具有不同参数的构造函数。有没有办法让它自动化,其他程序员不需要记得调用它。

我使用相当旧的框架,myFunction用于维护而不会破坏它。

编辑

myFunction是应用程序主窗口的公共成员函数,在所有应用程序代码中都可见。但myFunction我将被移出类mainWindow并在需要时被更改为全局函数。

我在考虑myClass头文件中的某种宏,因为这样我就不需要检查已编写的所有代码,并添加这些修改。但我找不到任何解决方案。

提前感谢任何想法和建议。

接受后。

问题在于MyClass的设计不好以及它在框架中的使用。我接受了Mark的回答,因为MyClass应该从一开始就由ClassFactory创建。

2 个答案:

答案 0 :(得分:8)

使用类工厂而不是直接调用new。工厂可以在返回指针之前调用myFunction

答案 1 :(得分:3)

对象工厂函数是一种可能的解决方案,但它使定义派生类变得更加困难和费力:虽然简单,但它非常具有侵入性。

如果你绝对必须这样做,那么一个实用的方法是定义一个像这样的宏:

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

myFunction返回其指针arg。您可以像这样使用该宏:

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

解决了问题的一半,即如何摆脱冗余。

另一半是如何使这个安全,以确保没有人直接使用new,只有你的MYNEW宏。对此的答案是,你不能,但是你可以直接使用new,这样一种错综复杂的,不切实际的,没有人能够无意中犯这个错误。为此,您只需使用额外参数定义分配函数(这样的分配函数称为“placement 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分配的每个成功构造的对象调用一个函数是一个非常具体且非常不寻常的要求。我怀疑你试图解决的问题更容易。即,你问的是错误的东西。

干杯&amp;第h。,