Portál AbcLinuxu, 9. května 2025 23:22

Dotaz: rucni volani konstruktoru a destruktoru v C++

30.11.2006 16:22 dylan hunt
rucni volani konstruktoru a destruktoru v C++
Přečteno: 2058×
Odpovědět | Admin
Ahoj.

Mam v C++ takovouto tridu:
class A {
public:
        A() { ... }
        ~A() { ... }
        ...
};
Z urcityho duvodu (interakce s knihovnou v C) ale nemuzu jeji instanci vytvorit pomoci new, ale pamet musim alokovat pres malloc. Je mozne potom nejak zavolat konstruktor a destruktor ?
A *a = (A *) malloc(sizeof(A));
// nejak zavolat konstruktor na *a
...
// nejak zavolat destruktor na *a
free(a)
Chtel bych navic zabranit volani kopirovaciho konstruktoru nebo operatoru prirazeni. Jo a navic nemuzu tride A pridat zadnou metodu...

Je neco takovyho vubec mozny ???

Diky.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Luboš Doležel (Doli) avatar 30.11.2006 16:24 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: rucni volani konstruktoru a destruktoru v C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
V Microsoft Visual C++ lze použít __ctor() a __dtor(); také by mě docela zajímalo, jestli něco podobného existuje v GCC.
30.11.2006 16:30 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: rucni volani konstruktoru a destruktoru v C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
K tomuto účelu slouží tzv. placement new.
30.11.2006 16:30 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: rucni volani konstruktoru a destruktoru v C++
(je to standardní součást jazyka, žádné nestandardní rozšíření)
30.11.2006 16:32 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: rucni volani konstruktoru a destruktoru v C++
Druhou možností je přetížení operátorů new a delete.
30.11.2006 16:50 dylan hunt
Rozbalit Rozbalit vše Re: rucni volani konstruktoru a destruktoru v C++
Diky, funguje to :-)

Vysledna podoba:
A *a = (A *) malloc(sizeof(A));
a = new(a) A();
...
a->~A();
free(a);
30.11.2006 17:17 Luboš Luňák | skóre: 19 | blog: Seli
Rozbalit Rozbalit vše Re: rucni volani konstruktoru a destruktoru v C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Na tu hlavni otazku placement new a rucni volani dtoru, jak uz tu je uvedeno. Na zabraneni volani jakekoliv metody staci ji deklarovat v private: sekci a nikde neimplementovat. Pak budou bud nedostatecna pristupova prava k pouziti nebo to linker nenajde. S tim nepridanim metody jsem to nejspis nepochopil, ale to asi nejde.
30.11.2006 17:49 dylan hunt
Rozbalit Rozbalit vše Re: rucni volani konstruktoru a destruktoru v C++
Asi jsem se spatne vyjadril. S tim nepridanim metody to bylo mysleno tak, ze tridu A nesmim nijak modifikovat. A s tim zabraneni volani tak, ze nechci pouzit treba:
*a = A();
protoze C++ by zavolalo 'operator =' u neinicializovaneho objektu.

Problem je uz vyresen, ale diky za snahu.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.