2012-07-18 1 views
2

J'ai essayé de faire une déclaration avant pour autoriser l'accès entre les classes. J'ai lu ici que:Problèmes de déclaration en avant C++/CLI

  • Je ne peux pas inclure le fichier « a.h » lors de la déclaration de l'avant A b.h

Je n'ai pas pu trouver beaucoup sur les espaces de noms lors de la déclaration en avant. Et je suis assez certain que je suis en train de déconner (je ne sais pas où les mettre). Les erreurs que je reçois sont après les extraits de code pertinents.

C'est ce que je l'ai fait:

  • J'ai divisé mes définitions de classe de tout être dans .h .cpp et .h

  • Je garde #ifndef dans mes fichiers .h

Ce sont mes fichiers:

Form1.cpp

#include "stdafx.h" 
#include "OpenGL.h" 
#include "Form1.h" 
#include "serialcom.h" 
#include "calculations.h" 

using namespace GUI_1; 

GUI_1::Form1::Form1(void) 
    {.... 
    } 
void GUI_1::Form1::chlabel2(float num) 
    {.... 
    } 
int GUI_1::Form1::updateHand(int source){....} 
void GUI_1::Form1::resetHand(){....} 

erreurs pour Form1.cpp C'est la même chose pour toutes les définitions

error C2872: 'GUI_1' : ambiguous symbol 
could be 'GUI_1' 
or  OpenGLForm::GUI_1' 

Form1.h

#ifndef form1 
#define form1 

using namespace OpenGLForm; 
//error C2871: 'OpenGLForm' : a namespace with this name does not exist 
ref class COpenGL; 

namespace GUI_1 { 

    using namespace System; 
    using namespace System::ComponentModel; 
    using namespace System::Collections; 
    using namespace System::Windows::Forms; 
    using namespace System::Data; 
    using namespace System::Drawing; 

    /// <summary> 
    /// Summary for Form1 
    /// </summary> 

    public ref class Form1 : public System::Windows::Forms::Form 
    { 
    public: 
     OpenGLForm::COpenGL^ o_gl; 
      // error C2653: 'OpenGLForm' : is not a class or namespace name 
     Form1(void); 
     void chlabel2(float num); 

    protected: 
     ... 
...};} 

OpenGL.h

#ifndef opengl 
#define opengl 

#pragma comment(lib, "opengl32.lib") 
#pragma comment(lib, "glu32.lib") 

#include <windows.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 
#include <math.h> 

// Declare globals 

.... 

namespace OpenGLForm 
{ 
    using namespace System::Windows::Forms; 
    using namespace GUI_1; 
    // error C2871: 'GUI_1' : a namespace with this name does not exist 

    ref class GUI_1::Form1; 
    // error C2653: 'GUI_1' : is not a class or namespace name 
    // 'Form1' uses undefined class 'OpenGLForm::GUI_1' 

    public ref class COpenGL: public System::Windows::Forms::NativeWindow 
    { 
    public: 

     Form1^ form1; 
      // error C2059: syntax error : ';' 
      // error C2238: unexpected token(s) preceding ';' 
      // error C2143: syntax error : missing ';' before '^' 

     ... 
}; 
} 
#endif 

OpenGL.cpp - aucune erreur ici

#include "stdafx.h" 
#include "OpenGL.h" 
#include "Form1.h" 

OpenGLForm::COpenGL::COpenGL(){}; 
... other functions that go the same way 

GUI_1.cpp - la fonction principale

#include <vcclr.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include "Form1.h" 
#include "calculations.h" 
#include "serialcom.h" 
#include "OpenGL.h" 

using namespace GUI_1; 
using namespace OpenGLForm; 

[STAThreadAttribute] 
int main(array<System::String ^> ^args) 
{ 
    // Enabling Windows XP visual effects before any controls are created 
    Application::EnableVisualStyles(); 
    Application::SetCompatibleTextRenderingDefault(false); 

    GUI_1::Form1 ^form1 = gcnew GUI_1::Form1(); 
    // error C2059: syntax error : '=' 
    OpenGLForm::COpenGL ^open_gl = gcnew OpenGLForm::COpenGL(); 

    form1->o_gl = open_gl; 
    // error C2143: syntax error : missing ';' before '->' 

    open_gl->form1 = form1; 
    // error C2059: syntax error : '=' 

    return 0; 
} 

Je vais continuer à essayer de déchiffrer ces messages, mais je J'apprécierais toute aide entre-temps.

Répondre

7
  • En OpenGL.h, vous devez déclarer avant-Form1 dans l'espace de noms correct:

    espace de noms GUI_1 { classe ref Form1; }

  • Et en avant-déclarer COpenGL en Form1.h de la même manière:

    espace de noms OpenGLForm { ref class COpenGL; }

Important: Assurez-vous que ces declareations sont en dehors d'autres blocs d'espace de noms, et retirez vos avant-déclarations existantes à l'intérieur des classes.

  • En Form1.cpp, il serait plus clair pour définir les fonctions membres dans un bloc d'espace de noms:

    espace de noms GUI_1 { Form1 :: Form1 (void) ...}

  • Les deux fichiers .cpp incluent Form1.h et OpenGL.h dans différents ordres. Il vaudrait mieux inclure uniquement Form1.h et Form1.h inclure OpenGL.h.

+0

Merci! Cela s'est débarrassé de la plupart des erreurs. La plupart des erreurs que j'obtiens maintenant sont liées à cette ligne: 'Form1^f_one'; dans OpenGL.h. L'erreur est toujours la même: 'erreur C2143: erreur de syntaxe: manquant ';' avant '^' '. Je ne peux pas trouver beaucoup de choses à ce sujet en ligne:/ – Mewa

+0

Si la réponse a été utile, vous pourriez oughta donner un upvote :) –

+0

Je ne peux pas :(J'ai besoin de plus de réputation, je suis désolé pardon! – Mewa