Page 1 of 2

Stocarea unei variabile membru de tip custom

Posted: 26 Oct 2010, 15:15
by mesajflaviu
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.

Re: Stocarea unei variabile membru de tip custom

Posted: 26 Oct 2010, 17:15
by Silviu Ardelean
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.

Re: Stocarea unei variabile membru de tip custom

Posted: 26 Oct 2010, 17:45
by mesajflaviu
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 .

Re: Stocarea unei variabile membru de tip custom

Posted: 26 Oct 2010, 17:46
by Silviu Ardelean
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. ;)

Re: Stocarea unei variabile membru de tip custom

Posted: 26 Oct 2010, 18:08
by Marius Bancila
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.

Re: Stocarea unei variabile membru de tip custom

Posted: 26 Oct 2010, 21:32
by Ovidiu Cucu
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. ;)

Re: Stocarea unei variabile membru de tip custom

Posted: 26 Oct 2010, 21:51
by Marius Bancila
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"

Re: Stocarea unei variabile membru de tip custom

Posted: 26 Oct 2010, 22:58
by Silviu Ardelean
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:

Re: Stocarea unei variabile membru de tip custom

Posted: 26 Oct 2010, 23:02
by Ovidiu Cucu
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:

Re: Stocarea unei variabile membru de tip custom

Posted: 27 Oct 2010, 00:27
by Marius Bancila
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.

Re: Stocarea unei variabile membru de tip custom

Posted: 27 Oct 2010, 09:15
by mesajflaviu
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 .

Re: Stocarea unei variabile membru de tip custom

Posted: 27 Oct 2010, 12:06
by Marius Bancila
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;
  }
};

Re: Stocarea unei variabile membru de tip custom

Posted: 27 Oct 2010, 13:03
by mesajflaviu
La mine nu merge , diferenta e ca enum-ul E este in afara clasei A ...

Re: Stocarea unei variabile membru de tip custom

Posted: 27 Oct 2010, 13:05
by Marius Bancila
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".

Re: Stocarea unei variabile membru de tip custom

Posted: 27 Oct 2010, 13:32
by mesajflaviu
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'