Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > .NET
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-03-2010
Avatar de rcarrillom
[rcarrillom] rcarrillom is offline
Miembro Premium
 
Registrado: dic 2004
Ubicación: UK / North Sea / Norway / Golfo de México / Frente a mi Laptop
Posts: 219
Poder: 20
rcarrillom Va por buen camino
Error C2248en C++: cannot access protected member

Saludos al foro, espero que sea el foro adecuado para mi duda.

Hace ya un buen que no programaba en C++, la versión que estoy usando es VS 2008 Professional, instalación completa.

Me han dado un código ya desarrollado que supuestamente compila, con la interfaz ribbon (qué manía de copiar interfaces) para hacer ciertas mejoras. No tengo contacto con el desarrollador original. El problema que tengo es el siguiente:

Cita:
error C2248: 'CMFCPropertyGridProperty::m_varValue' : cannot access protected member declared in class 'CMFCPropertyGridProperty'
c:\archivos de programa\microsoft visual studio 9.0\vc\atlmfc\include\afxpropertygridctrl.h(212) : see declaration of 'CMFCPropertyGridProperty::m_varValue'
c:\archivos de programa\microsoft visual studio 9.0\vc\atlmfc\include\afxpropertygridctrl.h(33) : see declaration of 'CMFCPropertyGridProperty'
Originado por la línea de código

Código:
((CMainFrame*)AfxGetMainWnd())->m_wndProperties.pKPInterval->m_varValue.bstrVal = meandistanceStr.AllocSysString();
Entiendo que no hay acceso a m_varValue por estar en la seccion protected, aunque para mi lógica sí deberia ser posible, de hecho no he modificado el código fuente aún, sólo intenté compilarlo. Tengo otras líneas con error como

Código:
    m_wndprogressBar.m_nWidth = 400;
    m_wndprogressBar.m_nHeight = 30;
con el error

Cita:
.\MainFrm.cpp(76) : error C2248: 'CMFCRibbonProgressBar::m_nWidth' : cannot access protected member declared in class 'CMFCRibbonProgressBar'
c:\archivos de programa\microsoft visual studio 9.0\vc\atlmfc\include\afxribbonprogressbar.h(69) : see declaration of 'CMFCRibbonProgressBar::m_nWidth'
c:\archivos de programa\microsoft visual studio 9.0\vc\atlmfc\include\afxribbonprogressbar.h(25) : see declaration of 'CMFCRibbonProgressBar'
Y otro ejemplo

Código:
        CMyView* pViewGraph = (CMyView*)((CMainFrame*)AfxGetMainWnd())->m_pViewActive;
con el error

Cita:
.\MyDoc.cpp(178) : error C2248: 'CFrameWnd::m_pViewActive' : cannot access protected member declared in class 'CFrameWnd'
C:\Archivos de programa\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxwin.h(3866) : see declaration of 'CFrameWnd::m_pViewActive'
C:\Archivos de programa\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxwin.h(3720) : see declaration of 'CFrameWnd'
De hecho son los tres únicos tipos de error pero en mas de 100 lineas similares. Una solución chapucera fué mover las declaraciones de protected hacia public, pero obviamente no debo modificar los fuentes del sistema, sólo los del programa ya desarrollado. Logré correr el programa de esta manera pero me generó errores al momento de refrescar la ventana de la aplicación.

Cómo puedo arreglar estos errores sin modificar los fuentes de C++? Es algo de namespaces? Ando perdido. Espero que sea un setting de C++, ya que no me proporcionaron el archivo original .sln, y solamente un archivo .suo con sólo parámetros de release.

Toda la ayuda es bienvenida
__________________
eLcHiCoTeMiDo - Rompecorazones profesional
Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos?
Salva a un nylon, usa prendas de piel de foca
Responder Con Cita
  #2  
Antiguo 10-03-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hace ocho años que no programo en C++ y -1 en .NET, pero, según parece, haces un molde de tipo para lograr acceder a algún elemento que fue declarado como protegido en la clase del objeto en cuestión.

El truco del "molde de acceso" es un recurso semielegante empleado en numerosos casos de programación. Pero alguna vez escuché que .NET y otras recientes tecnologías hacen tajante la visibilidad de los miembros de una clase, de tal manera que ni con trucos de moldes ni con pomada de la campana se puede acceder a donde las reglas lo impiden.

Si lo anterior es cierto, estarías obligado a seguir la buena práctica de crear una clase derivada donde hagas público el elemento en cuestión. El problema sería si la clase de la cual derivar estuviese siendo utilizada por otra clase (que también estés empleando), y ésta no permita redefinir qué clase utilizar.*

Imagino que otros compañeros tendrán más información sobre el tema.

Saludos.

Al González.
P.D. *A menos, claro, que la tecnología en cuestión ya admita redefinición de clases / herencia insertada.
Responder Con Cita
  #3  
Antiguo 11-03-2010
Avatar de rcarrillom
[rcarrillom] rcarrillom is offline
Miembro Premium
 
Registrado: dic 2004
Ubicación: UK / North Sea / Norway / Golfo de México / Frente a mi Laptop
Posts: 219
Poder: 20
rcarrillom Va por buen camino
En efecto Al, hay un abuso en la utilización de moldes, creo que el programador inicial no quiso utilizar una variable/clase derivada visible globalmente... O tal ves sí y mandó un código modificado no compilable (me enteré que al parecer no hay buena relación de la compañía con este animalito egipcio y la única vez que le hemos contactado directo sólo respondio, "i'm very busy with some projects").

Hubiera salido mas rápido y barato desarrollar de nuevo el sistema bajo Delphi ya que tengo todas las clases de proceso de datos desarrolladas, probadas y funcionando con otros sistemas similares , pero mira tú las consecuencias del malinchismo, si no viene del extranjero, el software no sirve . De hecho en Excel se desarrolaron macros como solución temporal que trabajan mil veces mejor que este mediocre programa...

Regresando al tema original, la propia ayuda me dirige a la descripción del error C2248 y viendo el primer ejemplo:

Código:
// C2248.cpp
#include <stdio.h>
class X {
public:
   int  m_pubMemb;
   void setPrivMemb( int i ) {
      m_privMemb = i;
      printf_s("\n%d", m_privMemb);
   }
protected:
   int  m_protMemb;

private:
   int  m_privMemb;
} x;

int main() {
   x.m_pubMemb = 4;
   printf_s("\n%d", x.m_pubMemb);
   x.m_protMemb = 2;   // C2248 m_protMemb is protected
   x.m_privMemb = 3;   // C2248  m_privMemb is private
   x.setPrivMemb(0);   // OK uses public access function
}
es prácticamente como están las declaraciones del programa. A mi precaria lógica, una instancia de la clase X debería acceder a la propiedad, pero como C++ es muy críptico, que alguien me explique en cristiano por qué demonios no es así.

Y viendo los mensajes de debug de otras librerias ya compiladas noté que vienen de VS2005 y el desarrollador nos requirió VS2008, por lo que sospecho que el desarrollo original inició arrastrando malas prácticas de programación ya que el artículo Breaking Changes in the Visual C++ 2005 Compiler señála los cambios al compilador.Y pues como no manejo C++ desde VS6 ... Por esto prefiero Delphi.

Y pues la solución será derivar, si hoy no queda, mando el proyecto a la goma y reutilizaré el código de las macros de Excel en un nuevo proyecto Delphi.

Pero no quiero quedarme sin la solución de esto, así que si alguien de los expertos de C++ en el foro puede ayudar, la ronda corre por mi cuenta .
__________________
eLcHiCoTeMiDo - Rompecorazones profesional
Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos?
Salva a un nylon, usa prendas de piel de foca
Responder Con Cita
  #4  
Antiguo 12-03-2010
Avatar de rcarrillom
[rcarrillom] rcarrillom is offline
Miembro Premium
 
Registrado: dic 2004
Ubicación: UK / North Sea / Norway / Golfo de México / Frente a mi Laptop
Posts: 219
Poder: 20
rcarrillom Va por buen camino
Arreglado el huarache. Parcialmente
  • Bueno, para empezar, mi lógica me sigue diciendo que las variables protegidas deberían poder ser accesadas aún en las clases derivadas, pero el estándar de C++, me lo prohibe, a lo que entendí en la documentación que he leido.
  • No entiendo cómo se podía compilar este código bajo las restricciones del estándar. Tuve que cambiar el código en unas cuantas lineas, como 100 .
La solución fué sustituir el uso de las variables protegidas por su correspondiente método público de acceso, por ejemplo:
Código:
CMyView* pViewGraph = (CMyView*)((CMainFrame*)AfxGetMainWnd())->m_pViewActive;
por
Código:
CMyView* pViewGraph = (CMyView*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();
Y tanto que me quebré la cabeza con soluciones mas complejas como clases derivadas, mover declaraciones, llamar al chapulín colorado... Insisto, cómo le podia compilar el fuente al desarrollador? Mi mente no malpensada me dice que todo fué una mala pasada de este individuo.

Una experiencia más, y ahora vamos a ver si corre. Considero mi duda primaria como resuelta.
__________________
eLcHiCoTeMiDo - Rompecorazones profesional
Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos?
Salva a un nylon, usa prendas de piel de foca
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error Abstract Error y Access violation zvf OOP 33 08-09-2010 19:50:33
Error access violation dmagui OOP 4 25-10-2006 10:57:50
Error al compactar access FGarcia Conexión con bases de datos 3 29-09-2006 20:03:45
Error Access Violation FGarcia Varios 1 14-06-2006 00:43:15
error con access supermilloriver Conexión con bases de datos 3 09-01-2006 14:06:12


La franja horaria es GMT +2. Ahora son las 15:00:35.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi