[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

Dwie wersje tworzenia obiektu (nie dla wrazliwych

azot16

8/12/2007 4:37:00 AM

Witam.

Ponizej zamiescilem fragment kodu. Fragment funkcji main() opatrzony
komentarzem "Wersja nr 2" jest delikatnie mówiac "hard-core". Przy
obecnej wersji klasy jak na razie "dzialaja" obie wersje.

Pytanie: jakie "elementy" C++ nalezy dodac do klasy aby spowodowac, ze
"Wersja nr 2" przestanie "dzialac" tzn. pojawia sie jakies bledy
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;
}

5 Answers

Rafal Dabrowa

8/12/2007 7:24:00 AM

0

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

Michal 'Khorne' Rzechonek

8/13/2007 1:51:00 PM

0

On 12 Sie, 06:36, azot16 <azo...@o2.pl> wrote:
> char *wsk = new char[sizeof(ABC)];
> //----------------
> ABC *wsk_obj = (ABC*)wsk;
> wsk_obj->Init();
> ABC::Print(*wsk_obj);
> //----------------
> delete wsk_obj;

Mozna nawet gorzej i bedzie to legalne (dopóki nie dotykasz this)

#include <iostream>

struct Foo {
void bar() {
std::cout << "qux" << std::endl;
}
};

int main() {
Foo *foo = NULL;
foo->bar();
}

Rozwiazaniem jak napisal Rafal jest zrobienie metody wirtualnej -
wtedy "zwykly malloc" nie spowoduje utworzenia w pamieci struktur
potrzebnych do znalezienia wlasciwej funkcji w czasie wywolania.

--
Khorne



azot16

8/13/2007 11:14:00 PM

0

> Foo *foo = NULL;
> foo->bar();

No to to jest juz przegiecie :). Nie wiem jak, ale twórcy C++ powinni
to jakos "zablokowac". Na szczescie przed takimi cudami nie musze sie
zabezpieczac.

Jednak z tym "virtual" jest obejscie - nie pisalem o tym wczesniej, bo
nie chcialem wydluzac maila. Obejscie jest nastepujace - przedstawiam
tylko" istotny" fragment:

zamiast:

//----------
char *wsk = new char[sizeof(ABC)];
//----------

piszemy np.

//----------
char *wsk = new char[sizeof(ABC)];
{
ABC a;
memcpy(wsk,&a,sizeof(ABC));
}
//----------

i wszystko smiga niestety :(. Czyli wystarczy zrobic sobie wzorzec
pamieci obiektu mem_obj[sizeof(ABC)] i potem go wkopiowywac pod
wskazniki na "char" które udaja wskazniki na obiekty. A ja szukam
sposobu jak zablokowac tego typu sztuczki.

Marcin 'Qrczak' Kowalczyk

8/13/2007 11:55:00 PM

0

Dnia 13-08-2007, Pn o godzinie 16:14 -0700, azot16 napisal(a):

> A ja szukam sposobu jak zablokowac tego typu sztuczki.

Nie da sie. Nie w C/C++.

--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.p...

Jedrzej Dudkiewicz

8/14/2007 10:13:00 AM

0

> A ja szukam sposobu jak zablokowaa tego typu sztuczki.

Nale?y chronia przed Murphym, nie przed Machiavellim.

JD