Pregunta

estoy usando C ++ .NET 2.0

Tengo 2 formas

el primero se declara como sigue

#include "stdafx.h"
    namespace myNamespace{

      public ref class frmMain : public System::Windows::Forms::Form {
      /*... snip ...*/
      public void addNewRow(String^ text){ /*... snip... */  }
      public void launchSubForm() { SubForm^ sf = gcnew SubForm(this); sf->Show(); }

      };
    }

la segunda es la siguiente

#include stdafx.h
    namespace myNamespace{
      ref class frmMain;
      public ref class SubForm : public System::Windows::Forms::Form {
      frmMain^ myMain;
      SubForm ( frmMain^ pMain){
        myMain = pMain;
      }
      /*... snip ...*/
      public void exportRows(String^ text){ /*... snip... */  }
        myMain->addNewRow("myNewText");   <--- This line causes compile error
      };
    }

en stdafx.hy tengo

/*... snip... */
#include "SubForm.h"
#include "frmMain.h"

Ahora a la pregunta! La línea en Subformulario hace que el compilador dime "uso de MyNamespace tipo indefinido :: frmMain

Realmente no tengo ni idea de por qué la "clase frmMain ref" doesnt resolver este problema

¿Fue útil?

Solución

Esto se debe a ambos de estos archivos de cabecera incluyen "stdafx.h" y stdafx.hy incluye "SubForm.h" antes "frmMain.h".

Así, en "SubForm.h", el compilador quiere definir Subformulario antes frmMain se ha definido, lo que lleva al error.

La forma correcta de resolver este problema es mantener todo el código para sus clases en el archivo de fuente apropiada, y no en la cabecera. Si su archivo de cabecera simplemente declara:

public void exportRows(String^ text);

A continuación, se puede definir:

public void SubForm::exportRows(String^ text)
{
    /*... snip ...*/
    myMain->addNewRow("myNewText");
}

en SubForm.cpp, y todo debería funcionar espléndidamente.


editar:. Buen diseño orientado a objetos consiste en separar la interfaz de la aplicación, y la mejor manera de que esto en C ++ es mantener interfaces en archivos de cabecera y código de aplicación en los archivos de origen correspondientes

La conclusión es que sus archivos de cabecera deben contener sólo declaraciones . Pensar en ellos como interfaz para sus clases. El archivo de cabecera muestra sólo las firmas de función que su clase va a implementar. Los archivos de origen, por el contrario, contienen toda la Definiciones , que son la puesta en práctica de sus clases.

Otros consejos

En C ++ se puede declarar solamente hacia adelante una clase si no está llamando a un método en un puntero o una referencia a esa clase. En cualquier momento que intenta llamar a un método en un puntero de clase o de referencia, es necesario tener la definición de clase disponible.

La eliminación de un tipo incompleto es legal, pero muy peligroso.

Utilice una etiqueta diferente a C ++, ya que esto no es C ++.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top