none
Structuration des codes et données en C++/CLI RRS feed

  • Question

  • Bonjour,

    Après avoir résolu les problème de technologies avec les forms qui à bien avance grâce à vous

    j'ai entrepris de séparer le code des données dans les classes de form

    ça donne ça pour le fichier d'interface:

    #pragma once
    #include "StdAfx.h"
    
    	
    namespace Test6 {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::IO;
    
    	
        /// <summary>
    	/// Description résumée de OpenAFile
    	/// </summary>
    	public ref class OpenAFile : public System::Windows::Forms::Form
    	{
    	private: 
    	    System::Windows::Forms::Button^  button3;
    		Form^ form1;
    	public:
    		string sFileToOpen;
    		OpenAFile::OpenAFile(void);
    		OpenAFile::~OpenAFile();
    		OpenAFile::OpenAFile(Form^ form1);
    		void OpenAFile::InitializeComponent(void);
    
    	protected: 
    	private: System::Windows::Forms::Label^  label1;
    	private: System::Windows::Forms::Button^  button1;
    	private: System::Windows::Forms::Button^  button2;
    
    	private: System::Windows::Forms::Label^  label2;
    	private: System::Windows::Forms::Label^  label3;
    	private: System::Windows::Forms::TextBox^  textBox1;
    	private: System::Windows::Forms::Label^  label5;
    	private: System::Windows::Forms::TextBox^  textBox2;
    	private: System::Windows::Forms::TextBox^  textBox3;
    	private: System::Windows::Forms::TextBox^  textBox4;
    	private: System::Windows::Forms::OpenFileDialog^  openFileDialog1;
    
    	private:
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
    		/// le contenu de cette méthode avec l'éditeur de code.
    		/// </summary>
    		private: System::Windows::Forms::ProgressBar^  progressBar1;
    		
    #pragma endregion
    
    };
    }

    et pour le fichier de code:

    #include "StdAfx.h"
    #include <string>
    #include "OpenAFile.h"
    Test6::OpenAFile objOpenAFile;
            void OpenAFile(void)
            {
                objOpenAFile.InitializeComponent();
                //
                //TODO: ajoutez ici le code du constructeur
                // Dans ce code il faut récupérer les donnée du fichier ini et initialiser les champs de la form
            }

            void OpenAFile( System::Windows::Forms::Form^ form1)
            {
                
                this->form1 = form1;
                objOpenAFile.InitializeComponent();
                //
                //TODO: ajoutez ici le code du constructeur
                // Dans ce code il faut récupérer les donnée du fichier ini et initialiser les champs de la form
                textBox1->Text = L"English";
                textBox2->Text = L"Word Document";
                textBox3->Text = L"Interbase";
                textBox4->Text = L"Coherence";
                Test6::OpenAFile* newWindow = this;
                System::EventArgs^  e;
                sFileToOpen = objOpenAFile.button3_Click( this, e);
                newWindow->ShowDialog();//Dialog
            }

            /// <summary>
            /// Nettoyage des ressources utilisées.
            /// </summary>
            void ~OpenAFile()
            {
                if (components)
                {
                    delete components;
                }
            }
            
            
            void Test6::OpenAFile::InitializeComponent(void)
            { this->label1 = (gcnew System::Windows::Forms::Label()); this->button1 = (gcnew System::Windows::Forms::Button()); this->button2 = (gcnew System::Windows::Forms::Button()); this->label2 = (gcnew System::Windows::Forms::Label()); this->label3 = (gcnew System::Windows::Forms::Label()); this->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->label5 = (gcnew System::Windows::Forms::Label()); this->textBox2 = (gcnew System::Windows::Forms::TextBox()); this->textBox3 = (gcnew System::Windows::Forms::TextBox()); this->textBox4 = (gcnew System::Windows::Forms::TextBox()); this->openFileDialog1 = (gcnew System::Windows::Forms::OpenFileDialog()); this->button3 = (gcnew System::Windows::Forms::Button()); this->SuspendLayout(); // // label1 // this->label1->AutoSize = true; this->label1->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->label1->Location = System::Drawing::Point(478, 93); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(99, 16); this->label1->TabIndex = 1; this->label1->Text = L"Database name"; // // button1 // this->button1->Location = System::Drawing::Point(609, 430); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 2; this->button1->Text = L"Process"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &OpenAFile::button1_Click); // // button2 // this->button2->Location = System::Drawing::Point(479, 430); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(75, 23); this->button2->TabIndex = 3; this->button2->Text = L"Cancel"; this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew System::EventHandler(this, &OpenAFile::button2_Click); // // label2 // this->label2->AutoSize = true; this->label2->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->label2->Location = System::Drawing::Point(478, 243); this->label2->Name = L"label2"; this->label2->Size = System::Drawing::Size(67, 16); this->label2->TabIndex = 5; this->label2->Text = L"File Name"; // // label3 // this->label3->AutoSize = true; this->label3->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->label3->Location = System::Drawing::Point(9, 224); this->label3->Name = L"label3"; this->label3->Size = System::Drawing::Size(99, 16); this->label3->TabIndex = 7; this->label3->Text = L"Document Type"; // // textBox1 // this->textBox1->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->textBox1->Location = System::Drawing::Point(12, 329); this->textBox1->Name = L"textBox1"; this->textBox1->Size = System::Drawing::Size(215, 22); this->textBox1->TabIndex = 8; // // label5 // this->label5->AutoSize = true; this->label5->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->label5->Location = System::Drawing::Point(9, 301); this->label5->Name = L"label5"; this->label5->Size = System::Drawing::Size(64, 16); this->label5->TabIndex = 10; this->label5->Text = L"Language"; // // textBox2 // this->textBox2->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->textBox2->Location = System::Drawing::Point(12, 255); this->textBox2->Name = L"textBox2"; this->textBox2->Size = System::Drawing::Size(215, 22); this->textBox2->TabIndex = 11; // // textBox3 // this->textBox3->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->textBox3->Location = System::Drawing::Point(481, 128); this->textBox3->Name = L"textBox3"; this->textBox3->Size = System::Drawing::Size(192, 22); this->textBox3->TabIndex = 12; // // textBox4 // this->textBox4->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->textBox4->Location = System::Drawing::Point(481, 283); this->textBox4->Name = L"textBox4"; this->textBox4->Size = System::Drawing::Size(192, 22); this->textBox4->TabIndex = 13; // // openFileDialog1 // this->openFileDialog1->FileName = L"openFileDialog1"; // // button3 // this->button3->Location = System::Drawing::Point(13, 46); this->button3->Name = L"button3"; this->button3->Size = System::Drawing::Size(75, 23); this->button3->TabIndex = 14; this->button3->Text = L"Choice a file"; this->button3->UseVisualStyleBackColor = true; this->button3->Click += gcnew System::EventHandler(this, &OpenAFile::button3_Click); // // OpenAFile // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(760, 509); this->Controls->Add(this->button3); this->Controls->Add(this->textBox4); this->Controls->Add(this->textBox3); this->Controls->Add(this->textBox2); this->Controls->Add(this->label5); this->Controls->Add(this->textBox1); this->Controls->Add(this->label3); this->Controls->Add(this->label2); this->Controls->Add(this->button2); this->Controls->Add(this->button1); this->Controls->Add(this->label1); this->Name = L"OpenAFile"; this->Text = L"OpenAFile"; this->ResumeLayout(false); this->PerformLayout(); } private: System::Void Test6::OpenAFile::button2_Click(System::Object^ sender, System::EventArgs^ e) { Test6::OpenAFile^ FormToOpen = this; FormToOpen->Close(); } private: System::Void Test6::OpenAFile::button1_Click(System::Object^ sender, System::EventArgs^ e) { // on récupère dans la grille les éléments saisis et on débute le traitement // on rend la main a la form1 pour afficher la progress bar Test6::OpenAFile^ FormToOpen = this; FormToOpen->Close(); // this->form1->progressBar1->Location = System::Drawing::Point(47, 215); // this->form1->progressBar1->Name = L"progressBar1"; // this->form1->progressBar1->Size = System::Drawing::Size(616, 23); // this->form1->progressBar1->TabIndex = 1; // this->form1->Controls->Add( progressBar1); // this->form1->progressBar1->Value = 50; } private: System::Void Test6::OpenAFile::button3_Click(System::Object^ sender, System::EventArgs^ e) { Stream^ myStream; SystemString^ wsFileToOpen; OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog; openFileDialog1->InitialDirectory = "c:\\"; openFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; openFileDialog1->FilterIndex = 2; openFileDialog1->RestoreDirectory = true; if( openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK ) { if( (myStream = openFileDialog1->OpenFile()) != nullptr ) { wsFileToOpen = openFileDialog1->SafeFileName; // Insert code to read the stream here. myStream->Close(); } } return( wsFileOpen); }

    et le compilateur me jette une bordée d'injures qui montre qu'il n'aime pas cela. J'ai donné le début des messages d'erreur provenant de cette évolution

    1>OpenAFile.cpp(4): error C3145: 'objOpenAFile' : une variable globale ou statique ne peut pas avoir de type managé 'Test6::OpenAFile'
    1>          impossible de déclarer une variable globale ou statique, ou un membre d'un type natif faisant référence à des objets du tas gc
    1>OpenAFile.cpp(4): error C2039: '{dtor}' : n'est pas membre de 'System::IDisposable'
    1>          c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::IDisposable'
    1>OpenAFile.cpp(16): error C2355: 'this' : ne peut être référencé qu'à l'intérieur de fonctions membres non static
    1>OpenAFile.cpp(16): error C2227: la partie gauche de '->form1' doit pointer vers un type class/struct/union/générique
    1>OpenAFile.cpp(21): error C2065: 'textBox1' : identificateur non déclaré
    1>OpenAFile.cpp(21): error C2227: la partie gauche de '->Text' doit pointer vers un type class/struct/union/générique
    1>          le type est ''unknown-type''
    1>OpenAFile.cpp(22): error C2065: 'textBox2' : identificateur non déclaré
    1>OpenAFile.cpp(22): error C2227: la partie gauche de '->Text' doit pointer vers un type class/struct/union/générique

    L’hygiène de programmation s'applique t'elle aux Forms?


    Jean Noël Martin



    vendredi 27 avril 2012 15:16

Réponses

Toutes les réponses

  • Bonjour,

    Votre méthode de programmation est correcte, mais il y a quelques choses qui manquent dans vos fichiers.

    Quand vous créez une application Windows Forms en Visual C++ le concepteur va placer par default la signature et le code de chaque fonction/méthode dans le fichier .h (tout est lié au mode de construction de ce concepteur).

    Vous pouvez bien sûr utiliser un fichier .cpp pour faire la séparation, mais n’oubliez pas inclure la référence vers le header file (vous l’avez fait déjà) et n’oubliez pas indiquer l’espace de noms soit par inclure le code pour ces méthodes/fonctions dans

    namespace EspaceNoms {
       .....
    }

    soit par utiliser Namespace::Class::function à la place de function comme vous utilisez dans votre fichier maintenant pour votre constructeurs et destructeur.

    Bonne journée,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mercredi 2 mai 2012 11:42
  • >Test6::OpenAFile objOpenAFile;

    Beurk une variable globale. ;-)

    Comme vous l'indique le message du compilateur, vous ne pouvez pas avoir d'instance d'objet globale dont le type est une classe managée.

    Les variables globales ou statiques (au sans C et non C++) sont générées par le compilateur en utilisant les primitives de la C-Runtime, pas du Framework .NET.

    Le Framework .NET utilise la technologie JIT compilation (Just In Time Compilation) qui nécessite une compilation à l'exécution et il est donc impossible d'avoir des objets initialisés directement dans le code binaire.

    Cela ne pose, dans la pratique, aucun souci, d'une part, parce que les globales c'est mal (;-)), et qu'elles sont avantageusement remplacées par des champs statiques des classes managées.

    Il faut donc remplacer

    Test6::OpenAFile objOpenAFile;

    par

    public ref class OpenAFile : public System::Windows::Forms::Form
    	{
    	public:
    		static OpenAFile^ objOpenAFile;
    ........
    	}

    Pour y accéder il faut utiliser "Test6::OpenAFile::objOpenAFile" à la place de "objOpenAFile".

    Notez la présence du mot-clé "static".

    En .NET, donc dans les classes managées, un membre static n'est pas un objet construit par le compilateur au moment de la compilation mais un objet qui est construit juste après le chargement et de la compilation JIT (à l'exécution donc) de la classe managée contenant le membre static.

    Ce n'est donc pas le compilateur qui construit le membre mais le Runtime .NET.

    A l'utilisation, c'est quand même très proche d'une variable globale, donc pensez à utiliser des Design Pattern type Singleton pour les éviter. Ces Design Pattern sont facilement implémentable avec ces membres statics justement.

    Votre approche de séparation de l'interface et de l'implémentation est possible mais je ne pense pas que c'est celle à suivre.

    La séparation .h .cpp du C/C++ n'est pas, à proprement parler, un mécanisme de déclaration d'interface. Il suffit de voir que tout les membres de la classe, y compris les membres privés, doivent apparaître dans le .H, c'est pas logique pour une interface.

    En C++/CLI, et en .NET en général, on utilise le concept bien distinct d'interface :

    http://www.functionx.com/cppcli/classes2/Lesson21e.htm

    Dans ces conditions, l'utilité d'avoir un .h et .cpp est nulle.

    Nous avons un .h déclarant l'interface de manière propre (pas de private etc...) et un .h déclarant et définissant une classe managé qui implémente d'interface déclaré dans l'autre .h.


    Paul Bacelar, Ex - MVP VC++

    mercredi 2 mai 2012 18:03
    Modérateur
  • Bonjour.

    Ce qui me sécurise, c'est que je ne suis pas le seul a avoir ce problème

    Mais je dois mal avoir compris le problème.

    Je suis revenu à ma première implémentation + namespace

    je vous joins le début de mon code header + cpp

    // d'abord le header
    
    #pragma once
    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
    #include "StdAfx.h"
    std::string sFileToOpen;
    std::string sPathOfTheFile;
    std::string sDiskOfTheFile;
    namespace Test6 {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::IO;
        /// <summary>
    	/// Description résumée de OpenAFile
    	/// </summary>
    	public ref class OpenAFile : public System::Windows::Forms::Form
    	{
    	public: 
    		Form^ form1;
    		Test6::OpenAFile^ objOpenAFile;
    		OpenAFile(void);
    		OpenAFile(Form^ form1);
    		void InitializeComponent(void);
    	private:
    		System::Void button2_Click(System::Object^ sender, System::EventArgs^  e);
    		System::Void button1_Click(System::Object^ sender, System::EventArgs^  e);
    		System::Void button3_Click(System::Object^  sender, System::EventArgs^  e); 
    	    System::Windows::Forms::Button^			button1;
    		System::Windows::Forms::Button^			button2;
    		System::Windows::Forms::Button^			button3;
    		System::Windows::Forms::Label^			label1;
    		System::Windows::Forms::Label^			label2;
    		System::Windows::Forms::Label^			label3;
    		System::Windows::Forms::Label^			label4;
    		System::Windows::Forms::Label^			label5;
    		System::Windows::Forms::TextBox^		textBox1;
    		System::Windows::Forms::TextBox^		textBox2;
    		System::Windows::Forms::TextBox^		textBox3;
    		System::Windows::Forms::TextBox^		textBox4;
    		System::Windows::Forms::ProgressBar^	progressBar1;
    		System::Windows::Forms::OpenFileDialog^ openFileDialog1;
    		System::ComponentModel::Container^		components;
    	protected:
    		~OpenAFile();
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
    		/// le contenu de cette méthode avec l'éditeur de code.
    		/// </summary>
    #pragma endregion
    };
    }
    //Test6::OpenAFile * objOpenAFile;
    
    // ensuite le code
    
    #include "StdAfx.h"
    #include <string>
    #include "OpenAFile.h"
    namespace Test6
    {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::IO;
    		
    	    OpenAFile()
    		{
    			InitializeComponent();
    			//
    			//TODO: ajoutez ici le code du constructeur
    		}
    
    		OpenAFile( System::Windows::Forms::Form^ form1)
            {
                
    			this->form1 = form1;
    			Test6::OpenAFile objOpenAFile = this;
    			InitializeComponent();
    			textBox1->Text = L"English";
    			textBox2->Text = L"Word Document";
    			textBox3->Text = L"Interbase";
    			textBox4->Text = L"Coherence";
    			Test6::OpenAFile* newWindow = this;
    			System::EventArgs^  e;
                            sFileToOpen = button3_Click( this, e);
    			newWindow->ShowDialog();//Dialog
            }
    
    		/// <summary>
    		/// Nettoyage des ressources utilisées.
    		/// </summary>
    		~OpenAFile()
    		{
    			if( components)
    			{
    				delete components;
    			}
    		}

    Et le résultat de la compilation:

    OpenAFile.cpp(14): error C2059: erreur de syntaxe : ')'
    OpenAFile.cpp(15): error C2143: erreur de syntaxe : absence de ';' avant '{'
    OpenAFile.cpp(15): error C2447: '{' : en-tête de fonction manquant (liste formelle à l'ancien format ?)
    OpenAFile.cpp(21): error C2143: erreur de syntaxe : absence de ')' avant '^'
    OpenAFile.cpp(21): error C2143: erreur de syntaxe : absence de ';' avant '^'
    OpenAFile.cpp(21): error C3145: 'System::Windows::Forms::Form' : une variable globale ou statique ne peut pas avoir de type managé 'Test6::OpenAFile'
              impossible de déclarer une variable globale ou statique, ou un membre d'un type natif faisant référence à des objets du tas gc
    OpenAFile.cpp(21): error C2888: 'System::Windows::Forms::Form' : impossible de définir un symbole dans un espace de noms 'Test6'
    OpenAFile.cpp(21): error C2039: '{dtor}' : n'est pas membre de 'System::IDisposable'
              c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::IDisposable'
    OpenAFile.cpp(21): error C2059: erreur de syntaxe : ')'
    OpenAFile.cpp(22): error C2470: 'form1' : similaire à une définition de fonction, mais aucune liste de paramètres ; corps apparent ignoré
    OpenAFile.cpp(40): error C2588: '::~OpenAFile' : destructeur global non conforme
    OpenAFile.cpp(41): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    OpenAFile.cpp(42): error C2065: 'components' : identificateur non déclaré
    OpenAFile.cpp(44): error C2065: 'components' : identificateur non déclaré


    Jean Noël Martin



    mercredi 2 mai 2012 18:33
  • Bonjour,

    Dans le fichier .cpp il ne suffit pas indiquer seulement l’espace de noms, il faut aussi indiquer le nom de la classe avant la méthode : OpenAFile::OpenAFile().

    Bonne journée,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 3 mai 2012 08:48
  • Oui

    j'abonde dans votre sens: ça a résolue un grand nombre d'erreurs de compilation. Je mettrai mon code dans le thread quand il marchera


    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 jeudi 3 mai 2012 09:53
    jeudi 3 mai 2012 09:53
  • Je pense que vous devriez vous habituer à déclarer des interfaces dans des .h déclarant des interfaces et à déclarer et implémenter vos classes dans 1 seul et même fichier .h.

    C'est peut-être différent des normes C++ standard mais c'est bien plus maintenable et productif, surtout avec les Framework et Design Pattern de .NET.


    Paul Bacelar, Ex - MVP VC++

    jeudi 3 mai 2012 10:36
    Modérateur
  • Pourquioi pas; je ne connais pas ça; mais je vais y penser.

    Jean Noël Martin

    jeudi 3 mai 2012 14:15
  • Je répugne a implémenter du codes dans des fichiers header: c'est une pétition de principe. Si Microsoft veut imposer cela, je ne suivrais pas.

    Jean Noël Martin

    jeudi 3 mai 2012 14:27
  • Prenez du recul sur les principes.

    Il y a toujours une justification à un principe.

    Le principe de séparer le code en .h et et .c est une technique qui a été mise en place pour pouvoir générer "rapidement" de "gros" exécutables sur des machines qui ne disposaient que de quelques Ko de RAM.

    Ainsi, le compilateur pouvait disposer du strict nécessaire pour faire son travail.

    Le principe a été repris avec le C++, et des personnes ont plaquées leur besoins de séparation entre l'API d'une classe en conception objet et l'implémentation de la classe.

    Mais ce n'est qu'une réutilisation très malheureuse et très imparfaite car dans un .h de classe C++ il y a des choses qui n'ont rien à voir avec une déclaration d'API de conception objets, comme les méthodes virtuelles privées, les membres protected etc...

    Car, et je le répète, ce qui est dans le .h sont les informations nécessaires au compilateur C++ à 2 passes pour pouvoir générer du code.

    Maintenant, la taille des données que doit manipuler un compilateur n'est plus trop un problème, la séparation entre les informations nécessaires à la compilation des autres modules et celles nécessaires à la génération de la classe proprement dites peuvent être inférées et stockées sans aucune intervention humaine.

    Mais le besoin de séparation entre l'API d'une classe en conception objet et l'implémentation de la classe existe toujours, mais au lieu de prendre une solution de récupération d'un mécanisme de l'antique période du C, le C++/CLI donne un mécanisme dédié bien plus propre.

    M$ ne vous oblige pas à utiliser ces mécanismes, mais n'allez pas pleurer si, à chaque modification d'une signature d'une méthode vous devez modifier 2 fichiers au lieu d'un, avec des messages d'erreurs cryptiques quand vous en oublez un ou que vous vous plantez dans le copier-coller, que des modifications dans la structure interne de la classe vous oblige à recompiler tout votre module et tout les projets utilisant cette classe, que les Designers de VS se mettent en rideau car ils n'arrivent plus à retrouver leur informations parceque vous avez supprimé une ligne de commentaire etc....

    Sachez pourquoi vous utilisez un principe et vérifiez qu'il s"applique bien et soyez ouvert à d'autres principes qui vous simplifient le développement et la maintenance du code.

    La complexité n'a jamais été un gage de qualité, bien au contraire.


    Paul Bacelar, Ex - MVP VC++

    jeudi 3 mai 2012 17:25
    Modérateur
  • Bonjour,

    Merci Paul pour ces explications !

    Jean, Microsoft ne veut imposer rien, mais pour une application Windows Forms le concepteur va créer un seul fichier pour la forme que vous construisez. L’explication est simple : le concepteur est commune a plusieurs langages de programmation et il est beaucoup plus facile gérer les choses de cette manière. Si vous voulez séparer la définition d’une forme en .h et .cpp vous pouvez le faire, mais comme Paul vous a déjà expliqué il y a le risque d’avoir un grand nombre d’erreurs de compilation.

    Bonne journée,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    vendredi 4 mai 2012 06:18
  • Ma petite expérience m'a montré que une fois réglé les problèmes de compilation le concepteur Visual Studio de form se calait sur la nouvelle organisation. J'ai été très surpris, je pensais devoir déplacer du code chaque fois que l'interface était modifié: ce n'est pas le cas. Je vais donc déplacer l'instruction pragma region pour entériner ce fonctionnement. Avec cette expérience, et tant que rien ne vient la modifier, je persiste et signe.

    Jean Noël Martin

    vendredi 4 mai 2012 09:47
  • Ok, mais pensez à regarder le concept d'interface, svp.

    Ils n'imposent rien mais offrent des outils pour simplifier et améliorer le codage.


    Paul Bacelar, Ex - MVP VC++

    vendredi 4 mai 2012 11:41
    Modérateur
  • Merci du renseignement.

    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 lundi 14 mai 2012 04:05
    vendredi 4 mai 2012 16:24