Cum pot modifica un obiect constant?

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
User avatar
dumion
Membru
Membru
Posts: 74
Joined: 25 Jul 2007, 10:17

Cum pot modifica un obiect constant?

Post by dumion » 10 Sep 2008, 14:21

Se poate modifica un obiect constant?



User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum pot modifica un obiect constant?

Post by Silviu Ardelean » 10 Sep 2008, 14:37

Aplicand operatorul const_cast.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot modifica un obiect constant?

Post by Ovidiu Cucu » 14 Sep 2008, 23:01

dumion wrote:Se poate modifica un obiect constant?
Hmmm... pe cati as impusca eu pentru asta!... ;)

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum pot modifica un obiect constant?

Post by Marius Bancila » 15 Sep 2008, 08:35

Acuma depinde exact de ce intelegi prin asta. Prin codul de mai jos modifici ceva constant.

Code: Select all

class foo
{
  int date;
public:
  int& GetDate() const {return &date;}
};

void funct(const foo& f)
{
  int& d = f.GetDate();
  d = 10;
}
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: Cum pot modifica un obiect constant?

Post by Dragos Cojocari » 15 Sep 2008, 10:12

Marius Bancila wrote:Acuma depinde exact de ce intelegi prin asta. Prin codul de mai jos modifici ceva constant.

Code: Select all

class foo
{
  int date;
public:
  int& GetDate() const {return &date;}
};

void funct(const foo& f)
{
  int& d = f.GetDate();
  d = 10;
}
Codul de mai sus nu cred ca se compileaza. :D

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum pot modifica un obiect constant?

Post by Marius Bancila » 15 Sep 2008, 10:22

Da, ca bine zici. N-am un VC++ 6 la indemana, as fi curios daca da eroare sau nu...
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot modifica un obiect constant?

Post by Ovidiu Cucu » 15 Sep 2008, 12:43

Pai, standardul spune cam asa
Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const object during its lifetime (3.8) results in undefined behavior.
Deci, dragii mei, ;) nu va jucati de-a behavioru nedefinit, numai de dragul de a vedea daca un anumit compiler "se prinde" sau nu.

bytefield
Junior
Junior
Posts: 35
Joined: 20 Jun 2008, 19:55
Location: Alba Iulia
Contact:

Re: Cum pot modifica un obiect constant?

Post by bytefield » 15 Sep 2008, 12:44

Tot la const_cast ajungi daca vrei sa-l compilezi...

Code: Select all

  int& GetDate() const {return const_cast<int&>(date);}
Numai ca e o problema cu designul aplicatiei daca ajungi sa modifici obiecte constante...

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: Cum pot modifica un obiect constant?

Post by Dragos Cojocari » 15 Sep 2008, 13:39

Cum zicea si Ovidiu, cod de acest gen trebuie vazut ca o invitatie la picioare in fund.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot modifica un obiect constant?

Post by Ovidiu Cucu » 15 Sep 2008, 14:14

Din pacate am intalnit cod de genul

Code: Select all

void CMoo::SayMoo(const CFoo& foo)
{
    int foofoo = const_cast<CFoo&>(foo).GetFoo();
    //... 
}
Asta din cauza ca un architect a uitat sa declare const pe CFoo::GetFoo iar bietul developer, conform diviziunii muncii, n-are voie sa umble la "design". Face si el ce poate si e "permis", deh!... :biggrin:
Cui ii dam picioare-n fund?

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot modifica un obiect constant?

Post by Ovidiu Cucu » 15 Sep 2008, 14:50

Trebuie sa recunoastem ca acel const_cast e cel mai tare... :biggrin:

Exista totusi cazuri justificate de a-l folosi (altfel nici nu s-ar fi inventat).
Ca un exemplu, sa zicem ca facem un mic wrapper pentru controlul listview.
Pentru a seta textul folosim o structura LVITEM oarecum "universala", adica este folosita atat pentru setarea cat si pentru citirea textului.
Deci are un membru non-const pszText de tipul LPTSTR.
Asta e... sa nu vad pe nimeni ca sare-n in sus cu "Windows API sucks!", pentru ca in primul rand e scris in C si in al doilea rand e facut sa fie cat mai "lite".

Code: Select all

void CMyListView::SetItemText(UINT nRow, UINT nCol, const std::tstring& strText)
{
    LVITEM lvi = {0};
    lvi.mask = LVCF_TEXT | LVCF_SUBITEM;
    lvi.pszText = const_cast<LPTSTR>(strText.c_str());
    lvi.iSubItem = nCol;
    WPARAM wParam = static_cast<WPARAM>(nRow); 
    LPARAM lParam = reinterpret_cast<LPARAM>(&lvi);

    ::SendMessage(m_hWnd, LVM_SETITEMTEXT, wParam, lParam);
}
// Din codul de mai sus mai lipsea doar dynamic_cast.
// Ce ti-e si cu c++ubercoolcasturile astea!... :D

User avatar
dumion
Membru
Membru
Posts: 74
Joined: 25 Jul 2007, 10:17

Re: Cum pot modifica un obiect constant?

Post by dumion » 15 Sep 2008, 15:22

Am inteles. Mersi de raspunsuri. :thumbup:

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot modifica un obiect constant?

Post by Ovidiu Cucu » 15 Sep 2008, 15:55

dumion wrote:Am inteles.
Ce-ai inteles? E bine sau nu e bine sa modifici un obiect constant?
;)

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: Cum pot modifica un obiect constant?

Post by Dragos Cojocari » 15 Sep 2008, 16:43

Ovidiu Cucu wrote:
dumion wrote:Am inteles.
Ce-ai inteles? E bine sau nu e bine sa modifici un obiect constant?
;)
Ebine, da tu grija sa nu te vada nimeni. :biggrin:

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum pot modifica un obiect constant?

Post by Silviu Ardelean » 15 Sep 2008, 17:18

Dragos Cojocari wrote:
Ovidiu Cucu wrote:
dumion wrote:Am inteles.
Ce-ai inteles? E bine sau nu e bine sa modifici un obiect constant?
;)
Ebine, da tu grija sa nu te vada nimeni. :biggrin:
Daca la review-ul pe cod partenerii de analiza nu-l vad... tot e bine... :whorship:
Pana vine unul care se loveste de probleme si itzi gaseste buba! :lol:

Post Reply