Siddhartha Gandhi wrote:
On Apr 8, 8:14 pm, "bark" <ander...@gmail.com> wrote:
On Apr 6, 8:39 pm, Gianni Mariani <gi3nos...@mariani.ws> wrote:
I just thought of yet another way - this one will create a default
constructed orzeroinitialized POD object depending on what type of
pointer you're trying to assign it to.
struct InitObj
{
template <typename T>
operator T * ()
{
return new T();
}
};
// usage - template automagically figures out which type to new
PMYSTRUCT * mys = InitObj();
int * z = InitObj();
Note the lack of amemsetcall and note that the code will work for POD
types as well as non POD types.
If in the class there is a C-character array, how does one initialize
such an array to 0's?
tia
Anders.
In the constructor, use memset()?
That's the point, the code above does not need to use memset.
i.e.
struct A { int a; char b[333]; };
A * foo() { return new A(); } // note the () after the A
The A object created above is guarenteed to be initialized by the C++
standard.
GCC creates the following code:
.globl _Z3foov
.type _Z3foov, @function
_Z3foov:
.LFB2:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
pushl %ebx
.LCFI2:
subl $16, %esp
.LCFI3:
pushl $340
.LCFI4:
call _Znwj
movl %eax, %ebx
addl $12, %esp
pushl $340
pushl $0
pushl %eax
call memset
movl %ebx, %eax
movl -4(%ebp), %ebx
leave
ret
Note the call to memset by the compiler.
The code below is just a simplification to make it easier to use...
struct NewInitializedObject
{
// conversion operator does automagic detection
// of which type to create.
template <typename T>
operator T * ()
{
return new T();
}
};
// usage
PMYSTRUCT * mys = NewInitializedObject();
mys points to a new MYSTRUCT correctly initialized.
thanks, i'll try this out.