mid geeksforgeeks c++ mfc stl

c++ - geeksforgeeks - MFC y STL



substring c++ (14)

Para colecciones en la capa de datos. No tengo datos para respaldar esto, pero mi sospecha es que las colecciones STL con plantillas son más eficientes que sus contrapartes de MFC.

¿Podría mezclar MFC con STL? ¿Por qué?


Por supuesto. Por qué no?

Yo uso MFC como la capa de presentación, a pesar de que las estructuras y clases en el back-end usan STL.


Sí, los he mezclado antes sin problemas. Sin embargo, después de usar MFC por más de una década, nunca consideraría usarlo para un nuevo proyecto.


Sí, los mezclo porque encuentro que MFC es demasiado difícil de manejar para un c ++ de apariencia natural. Aunque es posible que tenga que escribir algún código para conversiones donde su código STL se comunique con el código MFC.


Los mezclo todo el tiempo. El único PITA menor fue la serialización: los contenedores MFC ( CArray , CList , CStringArray , etc.) son compatibles CArchive serialización de CArchive , pero cuando se usan contenedores STL, debe pasar su propio código. Al final CArchive al uso de boost::serialization y CArchive material de MFC CArchive .


Fue una muy mala idea antes del soporte (casi) total de Visual Studio 2003 para el estándar C ++. Ahora no es una mala idea en absoluto. Si es una buena idea depende del contexto y de las habilidades de su equipo.


Use STL siempre que pueda, use MFC cuando no haya alternativa


Sí, si se cumplen las dos condiciones siguientes:

1) El lenguaje elegido para el proyecto es C ++ (que, por supuesto, incluye el STL - el S en el STL es para "Estándar").

2) Después de un análisis cuidadoso, no se encuentra ni se considera una alternativa mejor para el soporte de la GUI que MFC, y mi equipo de desarrollo lo hace.


Depende de cuál sea tu definición de "mezcla". Si simplemente quiere decir crear un proyecto que use tanto STL como MFC, no veo ningún daño en absoluto. Sirven un propósito diferente.


al mezclar STL con otros encabezados de Microsoft, asegúrese de definir NOMINMAX; de lo contrario, su función std :: min se distorsionará en un error de sintaxis debido a la macro min (a, b).


Uso MFC para todos mis proyectos C ++, ya que ninguno de mis proyectos es consola. MFC es una solución elegante para desarrolladores de Windows C ++. Odio QT, y no usaré WX en Windows. No me importa la portabilidad, ya que mis aplicaciones son solo para Windows. Me encanta la clase CString MFC / ATL, std :: string está muy cruda, no tiene ninguna característica de "String". std::string no es más que vector<char> .

Para todos los algoritmos y el almacenamiento de datos, uso STL. También uso las clases de plantilla de ConcRT PPL, que son muy similares a las de STL.


Prefiero evitar STL y no utilizarlo porque antes no era tan estándar cuando MFC era estándar de facto durante aproximadamente una década. También hasta versiones recientes de Visual C ++ (y STL "estándar"), MFC solo tiene un mejor rendimiento.


Tenía una estructura con muchos campos de tipo simple (UINT, CString, COLORREF, etc.). El proyecto estaba compilando bien.

Luego agregué un que agregué un CArray a la estructura. No estaba compilando.

Luego implementé operador = y constructor de copia para esa estructura (uno usando el otro). Luego compiló.

Algún tiempo después, haciendo mantenimiento a la estructura, hice un experimento: cambie CArray para que sea un std :: vector y elimine operator = y copie el constructor. Se compiló bien y la estructura se copiaba bien donde se llamaba operator = o copy constructor.

La ventaja es que podría volcar una parte inútil del código, propenso a errores y probablemente no actualizado cuando alguien hizo mantenimiento agregando un campo a la estructura. - Y veo eso como una gran ventaja.

RAZÓN:

¿Por qué no necesito el copy-constructor y el operador = assignment ahora?

Antes, la estructura solo tenía campos de tipo simple. Entonces fueron copiables. Siendo todos ellos copiables, hace que la estructura sea copiable. Cuando agregué el campo CArray, este no era copiable, porque CArray deriva de CObject, una clase que explícitamente hace que estas dos funciones sean privadas:

class AFX_NOVTABLE CObject { //... private: CObject(const CObject& objectSrc); // no implementation void operator=(const CObject& objectSrc); // no implementation //... }

Y CArray, al ser una clase derivada de CObject, no hace nada para anular este comportamiento, por lo que CArray lo heredará y se volverá imposible de compilar. Al haber agregado un CArray antes de hacer que mi estructura se pueda copiar, estaba recibiendo el error:

c:/program files/microsoft visual studio 8/vc/atlmfc/include/afxtempl.h(272) : error C2248: ''CObject::operator ='' : cannot access private member declared in class ''CObject'' c:/program files/microsoft visual studio 8/vc/atlmfc/include/afx.h(554) : see declaration of ''CObject::operator ='' c:/program files/microsoft visual studio 8/vc/atlmfc/include/afx.h(524) : see declaration of ''CObject'' This diagnostic occurred in the compiler generated function ''CArray<TYPE,ARG_TYPE> &CArray<TYPE,ARG_TYPE>::operator =(const CArray<TYPE,ARG_TYPE> &)'' with [ TYPE=unsigned int, ARG_TYPE=unsigned int & ]

El std :: vector se puede copiar por su propia definición:

// TEMPLATE CLASS vector template<class _Ty, class _Ax = allocator<_Ty> > class vector : public _Vector_val<_Ty, _Ax> { // varying size array of values public: typedef vector<_Ty, _Ax> _Myt;

Aviso _Myt es un typedef de la clase vectorial en sí.

//... vector(const _Myt& _Right) : _Mybase(_Right._Alval) { // construct by copying _Right if (_Buy(_Right.size())) _TRY_BEGIN this->_Mylast = _Ucopy(_Right.begin(), _Right.end(), this->_Myfirst); _CATCH_ALL _Tidy(); _RERAISE; _CATCH_END } //... vector(_Myt&& _Right) : _Mybase(_Right._Alval) { // construct by moving _Right _Assign_rv(_STD forward<_Myt>(_Right)); } _Myt& operator=(_Myt&& _Right) { // assign by moving _Right _Assign_rv(_STD forward<_Myt>(_Right)); return (*this); } //... }

Por lo tanto, agregar un campo de miembro std :: vector a una estructura / clase no requerirá que implemente funciones de copia dentro de él, solo debido a ese nuevo campo.