Avatar billede krismort Nybegynder
11. august 2008 - 10:56 Der er 8 kommentarer

Kald af ctor uden brug af new i msvc

Hej,
Kan jeg kalde ctor ved brug af feks noget asm eller ved at oprette en funktionspointer som jeg for til at pege på addressen til konstruktoren ?

Mvh Kristian
Avatar billede arne_v Ekspert
11. august 2008 - 14:53 #1
X o1;
Y o2(123);

kalder constructor uden brug af new. Men det er maaske ikke det du leder efter ?
Avatar billede bertelbrander Novice
11. august 2008 - 19:30 #2
Man kan ikke kalde constructoren uden at oprette et objekt.

Normalt løser man problemet ved at kalde en funktion fra construktoren, som man så kan kalde som enhver anden funktion.
Avatar billede krismort Nybegynder
11. august 2008 - 19:42 #3
jeg fandt ud af at man kan overloade "placement new" og kalde new der hvor vil kalde constructoren.
Avatar billede bertelbrander Novice
11. august 2008 - 19:59 #4
Man kan godt bruge placement new, men det er meget grimt
Avatar billede kenneth_gorking Nybegynder
12. august 2008 - 01:09 #5
Jeg ville ikke kalde placement new grimt, tværtimod er det en ret elegant løsning til når man f.eks bruger memory-pools af objekter som har constructors der skal kaldes.

I msvc findes der dog en anden måde :)

void reconstruct(SomeClass *sc)
{
    sc->SomeClass::SomeClass( /*argumenter*/ );
}
Avatar billede bertelbrander Novice
12. august 2008 - 01:37 #6
Tillad mig at præcisere; placement new er ikke i sig selv grimt, det har bestemt sine anvendelser.
Men at bruge placement new til at kalde en bestemt funktion på en class er grimt.

Og MSVC's  underlige omgåelse er også grim.

En constructor er til for at konstruere et objekt, den kaldes når man konstruerer et objekt og ikke på andre tidspunkter.
Avatar billede krismort Nybegynder
12. august 2008 - 08:29 #7
Jeg burde måske have formuleret spørgsmålet anderledes, jeg skal kalde constructoren umildbart efter allokerings tidpunktet. Jeg har brug for at oprette objektet i en præallokeret buffer istedet for et vilkårligt sted i hukommelsen.
Avatar billede kenneth_gorking Nybegynder
12. august 2008 - 14:02 #8
Så er det placement new du skal bruge.

#include <new>

class X
{
    ...
};

char preallocated_buffer[4096];
X* new_X_from_buffer()
{
    return new(preallocated_buffer) X;
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester