Oarecum offtopic, intr-un context similar unii fug de containerele MFC bazate pe row-pointers spre STL in ideea de-a face usor debugging si aici treaba o poti face mai bine cu containere STL. Bine, in cazul dat cand ai niste octeti nu e vreo imbunatatire folosind std::vector.
Last edited by Silviu Ardelean on 26 Aug 2014, 14:01, edited 3 times in total.
Chiar vrei sa copiezi datele tinute in CArray<CArray<COLORREF>> in alte instante de genul via GetBitmapArray() sau doar ai nevoie de acces la acel buffer BitmapData?
Daca da, as zice sa te mai gandesti daca chiar merita sa ai "puritate MFC". Cu un std::vector pe compilator de C++11 si move semantics "copierea" ar trebui sa fie eficienta (shallow copy). Cu vechile containere MFC ai deep copy.
In al doilea caz un pointer/referinta la containerul intern ar fi suficient.
Nu stiu cum declari un CArray de CArray-uri de DWORDS dar...
Varianta mea e: CArray< CArray<COLORREF> >(intre < CArray si > > este spatiu - am citit pe net si cred ca asta-i smecheria) - incercarea moarte n-are.
Si...
Imi dau cu parerea in alte privinte - care sunt sigur ca sunt irelevante pentru problema ta:
Metoda aia GetBitmapArray intoarce valoare la aray de array. Chiar daca tu ai pus & acolo tot iti copiaza, nici nu stiu daca compileaza de fapt.
Faza e ca tu te invarti in cerc. Ideea e asta:
Ai un membru privat care este destul de mare incat n-ai vrea sa trimiti copie la el in getter.
Deci solutia ar fi sa intorci referinta.
Acum daca intorci referinta si referinta nu e const, dai voie la oricine sa-ti modifice tie array-ul ala - si private in cazul asta nu-si mai are sensul. Poti la fel de bine sa-l faci public, getterul ala e doar asa, de fun.
Nu stiu cum e cu move semantics dar in cazul tau nu prea conteaza ca e MFC sau STL, move sau RVO nu se aplica pe membrii clasei sau pe lvalue tocmai din motivul mai sus mentionat - ca nu vrei sa expui un obiect membru al clasei tale la toti apelantii - ca de asta l-ai pus in clasa si l-ai facut privat - sa nu-l porcaiasca nimeni - si move n-o sa se intample ca e membru si nu vrea nimeni sa lase sa se fure un membru - move e pentru altceva.
Practic tu ai 2 probleme:
1. Sa declari o matrice de CArray-uri de COLORREF-uri.
2. Ai un membru privat pe care vrei sa-l dai la toti. - Bine daca returnezi prin valoare e ok, ca fiecare isi ia copia lui. Daca tu modifici m_arrBitmapData - ceilalti utilizatori ai lui n-o sa stie de ea.
De fapt oricum ai face ai probleme:
Conteaza mult ce faci si cum faci, ca si daca intorci referinta si tu distrugi clasa CBitmapOp - referentiatorii o sa ramana cu, vorba aia, "referinta in soare".
Daca intorci prin valoare fiecare apelant o sa aibe o copie. Daca tu vrei sa propagi modificarile lui m_arrBitmapData in timp real la toti utilizatorii ei/lui(oare CArray e femeie?) atunci ai o problema.
Acum, ca sa fii sigur si smecher -- il faci pe m_arrBitmapData ala smart_pointer si ai rezolvat balciul. - Dar, bineinteles o sa ai alta problema - aceeasi pe care o ai daca intorci referinta si ai 100 de threaduri.
Deci ca sa fie safe cumva ai putea sa-l faci vaca-smartpointer . Adik daca unu vrea sa il editeze atunci copiezi.
O sa ma opresc aici ca ai destule probleme pentru azi si nici n-ai aflat raspunsul la prima intrebare:)
Last edited by bu7ch3r on 20 Feb 2015, 10:04, edited 1 time in total.
problema e ca daca incerc sa inserez vreun rand in aceasta lista imi da eroare ... care sa fie problema : nu am obtinut bine pointer-ul spre CListCtrlEx ? Daca e asa , de ce pot seta coloanele listei ?