Stocarea unei variabile membru de tip custom

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
mesajflaviu
Membru++
Membru++
Posts: 689
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Stocarea unei variabile membru de tip custom

Post by mesajflaviu » 26 Oct 2010, 15:15

As vrea sa va intreb cum as putea sa rezolv mai elegant o problema relativ simpla :
Cum se poate stoca intr-o variabila membru a unui tip de data de tip custom , pentru a putea-o folosi intre doua evenimente , OnKeyDown si OnKeyUp de exemplu :
in clasa CMyView am initializat

Code: Select all

private:
    int m_nToolTemp
iar in

Code: Select all

void CMyView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default

	if(nChar == VK_SPACE)
	{
		m_nToolTemp = CDrawTool::c_drawShape;
	}

	CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}
apoi in

Code: Select all

void CMyView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default

	if(nChar == VK_SPACE)
	{
                 CDrawTool::c_drawShape = m_nToolTemp;
	}

	CScrollView::OnKeyUp(nChar, nRepCnt, nFlags);
}
iar eroarea de compilare este :

Code: Select all

error C2440: '=' : cannot convert from 'int' to 'enum DrawShape'
... am incercat sa fac static_cast la CDrawTool::c_drawShape dar degeaba .. stiu ca aceasta problema se poate rezolva fara sa folosesc tipuri custom dar nu mi se pare elegant ...

Multumesc.



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

Re: Stocarea unei variabile membru de tip custom

Post by Silviu Ardelean » 26 Oct 2010, 17:15

Nu am timp sa fac un proiect si sa-ti testez codul, dar tin sa cred ca obtii eroarea la linia

Code: Select all

CDrawTool::c_drawShape = m_nToolTemp;
Problema apare de la faptul ca la tine c_drawShape e un enum type ce se stabileste la compile-time, nu la run-time cum incerci tu sa faci.
In rezolvarea problemei, eu as renunta la acest tip enumerare si as folosi tipuri clasice, un vector, structura, etc. Tu stii cel mai bine ce ti se preteaza.

mesajflaviu
Membru++
Membru++
Posts: 689
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Stocarea unei variabile membru de tip custom

Post by mesajflaviu » 26 Oct 2010, 17:45

Silviu Ardelean wrote:Nu am timp sa fac un proiect si sa-ti testez codul, dar tin sa cred ca obtii eroarea la linia

Code: Select all

CDrawTool::c_drawShape = m_nToolTemp;
Problema apare de la faptul ca la tine c_drawShape e un enum type ce se stabileste la compile-time, nu la run-time cum incerci tu sa faci.
In rezolvarea problemei, eu as renunta la acest tip enumerare si as folosi tipuri clasice, un vector, structura, etc. Tu stii cel mai bine ce ti se preteaza.
Da , la acea linie am eroare de compilare .

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

Re: Stocarea unei variabile membru de tip custom

Post by Silviu Ardelean » 26 Oct 2010, 17:46

mesajflaviu wrote:
Silviu Ardelean wrote:Nu am timp sa fac un proiect si sa-ti testez codul, dar tin sa cred ca obtii eroarea la linia

Code: Select all

CDrawTool::c_drawShape = m_nToolTemp;
Problema apare de la faptul ca la tine c_drawShape e un enum type ce se stabileste la compile-time, nu la run-time cum incerci tu sa faci.
In rezolvarea problemei, eu as renunta la acest tip enumerare si as folosi tipuri clasice, un vector, structura, etc. Tu stii cel mai bine ce ti se preteaza.
Da , la acea linie am eroare de compilare .
E o eroare clasica... nu poti atribui runtime noi valori unei variabile enumerare. Renunta la enum. ;)

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

Re: Stocarea unei variabile membru de tip custom

Post by Marius Bancila » 26 Oct 2010, 18:08

Pai stati asa, ce nu inteleg eu e urmatorul lucru: de ce m_nToolTemp, care e doar o copie a lui c_drawShape, nu are acelasi tip ca si c_drawShape? De ce e int? Pune-l de acelasi tip enum cum e logic sa fie si gata, problema e rezolvata frumos. Daca vrei s-o rezolvi "urat", atunci cand faci copierea inversa:

Code: Select all

CDrawTool::c_drawShape = m_nToolTemp;
fa un cast de la int-ul lui m_nToolTemp catre enum-ul lui c_drawShape.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

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

Re: Stocarea unei variabile membru de tip custom

Post by Ovidiu Cucu » 26 Oct 2010, 21:32

Marius Bancila wrote:fa un cast de la int-ul lui m_nToolTemp catre enum-ul lui c_drawShape.
Daca ar vedea MISRA asa ceva, ar face spume. :D :biggrin:
Eu zic, mai bine e de pastrat pe cat posibil consistenta tipurilor chiar daca poate aparea mai putin "elegant" in ochii unui architect.
Altfel se poate ajunge ca, prin unele locuri, un amarat de developer sa scrie "functii de conversie" de la int la enum X, numai sa inchida gura unei scule de analiza statica de cod. ;)

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

Re: Stocarea unei variabile membru de tip custom

Post by Marius Bancila » 26 Oct 2010, 21:51

Cineva zicea ca "un text scos din context e un pretext". Ai facut acuma exact ca ziaristii, din tot ce am zis eu ai luat o bucatica si ai comentat pe ea de parca numai aia spusesem. Nici macar nu ai citat inceputul frazei:
Daca vrei s-o rezolvi "urat"
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

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

Re: Stocarea unei variabile membru de tip custom

Post by Silviu Ardelean » 26 Oct 2010, 22:58

Marius Bancila wrote:Cineva zicea ca "un text scos din context e un pretext". Ai facut acuma exact ca ziaristii...
Eu nu vad vreun pretext in ce zice Ovidiu. E un argument in plus pentru a se evita chestii "urate".
La capitolul scos din context pentru pretext, imi pare rau dar nimeni de pe aici nu are skill-urile necesare. In schimb, avem niste prieteni maestrii in aceasta arta. :keeporder:

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

Re: Stocarea unei variabile membru de tip custom

Post by Ovidiu Cucu » 26 Oct 2010, 23:02

Scuze, Marius, n-a fost cu nici o intentie rea.
Personal, nu consider un cast de la int la enum X chiar asa din cale-afara de urat.

[ off-topic ]
Revin maine.
Acuma e tarziu, sunt obosit si, ziaristii zic: "mai sunt doua voturi pana cade guvernul"... :biggrin:

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

Re: Stocarea unei variabile membru de tip custom

Post by Marius Bancila » 27 Oct 2010, 00:27

Nu e o problema, nu e nici suparare. Era doar o observatie; tot ce voiam e sa nu ramenem cu impresia ca eu am vorbit doar de castul la int.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

mesajflaviu
Membru++
Membru++
Posts: 689
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Stocarea unei variabile membru de tip custom

Post by mesajflaviu » 27 Oct 2010, 09:15

Marius Bancila wrote:...Pune-l de acelasi tip enum cum e logic sa fie si gata, problema e rezolvata frumos...
Asta n-am reusit eu , sa initializez o variabila membru de tip custom ... de tip enum al altei clase .

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

Re: Stocarea unei variabile membru de tip custom

Post by Marius Bancila » 27 Oct 2010, 12:06

Adica nu ai reusit asta?

Code: Select all

class A
{
public:
  enum E {unu, doi, trei};
};

class B
{
  A::E m_val;
public:
  B()
  {
    m_val = A::unu;
  }
};
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

mesajflaviu
Membru++
Membru++
Posts: 689
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Stocarea unei variabile membru de tip custom

Post by mesajflaviu » 27 Oct 2010, 13:03

La mine nu merge , diferenta e ca enum-ul E este in afara clasei A ...

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

Re: Stocarea unei variabile membru de tip custom

Post by Marius Bancila » 27 Oct 2010, 13:05

Ce-ar fi ne arati codul (cum e definita variabila si enumul). Eu inca nu am reusit sa inteleg prea bine partea asta "membru de tip custom ... de tip enum al altei clase".
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

mesajflaviu
Membru++
Membru++
Posts: 689
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Stocarea unei variabile membru de tip custom

Post by mesajflaviu » 27 Oct 2010, 13:32

Ok :

Code: Select all

// DrawTool.h: interface for the CDrawTool class.

enum DrawShape { selection, line, zoom, hand };

class CDrawTool
{
public:
	CDrawTool(DrawShape nDrawShape);
	virtual ~CDrawTool();
...
...

	DrawShape m_drawShape;
}

Code: Select all

// MyView.h : interface of the CMyView class
//

class CMyView : public CScrollView
{
...
private:
	CDrawTool::c_drawShape m_tool;
...
}

iar la compilare :

Code: Select all

error C2602: 'CDrawTool::c_drawShape' is not a member of a base class of 'CMyView'

Post Reply