Rafal Dabrowa
8/12/2007 7:24:00 AM
azot16 wrote:
> Witam.
>
> Poni?ej zamie?ci3em fragment kodu. Fragment funkcji main() opatrzony
> komentarzem "Wersja nr 2" jest delikatnie mówi?c "hard-core". Przy
> obecnej wersji klasy jak na razie "dzia3aj?" obie wersje.
>
> Pytanie: jakie "elementy" C++ nale?y dodaa do klasy aby spowodowaa, ?e
> "Wersja nr 2" przestanie "dzia3aa" tzn. pojawi? sie jakie? b3edy
> wykonania programu itp.
>
> class ABC
> {
> public:
> ABC() { Init(); }
> ~ABC() { printf("<Bye>\n"); }
> void Init() { printf("<Hi>\n"); x = 5; }
> int Fun() { x *= 2; return x; }
> static void Print(ABC& obj);
> int x;
> };
>
> void ABC::Print(ABC& obj)
> {
> printf("x = %d\n",obj.x);
> printf("obj.Fun() = %d\n",obj.Fun());
> printf("x = %d\n",obj.x);
> }
>
> int main()
> {
> // Wersja nr 1
> {
> ABC a;
> ABC::Print(a);
> }
> printf("\n----------------------\n\n");
> // Wersja nr 2
> {
> char *wsk = new char[sizeof(ABC)];
> //----------------
> ABC *wsk_obj = (ABC*)wsk;
> wsk_obj->Init();
> ABC::Print(*wsk_obj);
> //----------------
> delete wsk_obj;
> }
> return 0;
> }
>
Nawet bez zmian w klasie ABC, gdyby? alokowa3 nie pod jeden element a
np. pod 10.
A dla tego testu jaki masz wystarczy metode Init zrobia wirtualn?.
Prawid3owo to sie robi tak:
#include <new>
...
char *wsk = new char[sizeof(ABC)];
//----------------
ABC *wsk_obj = new(wsk) ABC;
ABC::Print(*wsk_obj);
//----------------
wsk_obj->~ABC();
delete[] wsk;
--
Rafal