Wrapper c++/cli d'une classe native C++

dodo7263 642 Messages postés mercredi 10 septembre 2008Date d'inscription 9 février 2017 Dernière intervention - 26 juil. 2016 à 15:59
Bonjour,
Alors voila, j'ai une classe native c++ que j'aimerais exposé en c# via un wrapper c++/cli.
Mais j'ai quelques difficultés à finaliser ce @%%^^* de wrapper. Voici les sources de la classe native
et de ce que j'ai fait jusqu'à présent. J'ai un problème pour wrapper en fait un opérateur surchargé.
Ma classe native fonctionne très bien. Je l'ai testée.
Ca sera plus parlant avec les sources : le fichier .h

#ifndef AFGEN_H
#define AFGEN_H

#include <string>
#include <map>

// look up tabulated data stored in a file or memory
typedef enum {TABLE_IN_FILE=0, TABLE_IN_MEMORY} TableSource;

class afgen
{
private:
   std::string fname_;     // file name where tabulated data is stored
   std::map<double, double> table_;  // stored tabulated data

   void Match(double const &key, double &key0, double &key1,
              double &val, double &val0, double &val1,
              bool &bFound, bool &bFirstLine) const;

public:
   afgen() {}
   explicit afgen(std::string const &name) : fname_(name) {}
   afgen(afgen const &rhs) : fname_(rhs.fname_), table_(rhs.table_) {}

   afgen &operator=(afgen const &rhs)
   {
      fname_ = rhs.fname_; 
	  table_ = rhs.table_; 
	  return *this;
   }

   std::string const &Filename() const {return fname_;}

   void Filename(std::string const &fname)
   {
      fname_ = fname; 
	  table_.clear();
   }

   std::map<double, double> const &Table() const {return table_;}

   void MemoriseTable();
   void ForgetTable() {table_.clear();}

   void LookUp(double const &key, double &val,TableSource source=TABLE_IN_MEMORY) const;

   bool operator()(double const &key, double &val, TableSource source=TABLE_IN_MEMORY) const;
};

Et voici ce que j'ai fait jusqu'à présent : le fichier wrapperNative.h
// Wrapper.h
#pragma once

#include "Stdafx.h"
#include <algorithm>
#include <iterator>
#include <cliext\map>
#include "afgen.h" // header de ma classe native
using namespace::System::IO;
using namespace System;

namespace Wrapper {

// look up tabulated data stored in a file or memory
typedef enum { TABLE_IN_FILE = 0, TABLE_IN_MEMORY } TableSource;

public ref class afgenWrapper
{
private:
	afgen* m_Afgen; // pointer to the C++ native class
	String^ fname_; // file name where tabulated data is stored
	
	cliext::map<double, double> table_;  // stored tabulated data

	void Match(double const %key, double %key0, double %key1,
		       double %val, double %val0, double %val1,
  		       bool %bFound, bool %bFirstLine) /*const*/;

public:
	afgenWrapper(){ m_Afgen = new afgen(); }
	

	explicit afgenWrapper(String^ const %name) : fname_(name) { m_Afgen = new afgen(); };
   
	afgenWrapper(afgenWrapper const %rhs) : fname_(rhs.fname_), table_(rhs.table_) { m_Afgen = new afgen(); };
	

	~afgenWrapper(){ this->!afgenWrapper(); }
	!afgenWrapper(){ delete m_Afgen; m_Afgen = 0; }

	afgenWrapper operator=(afgenWrapper% const rhs)
	{
		return m_Afgen->operator=(rhs); // ce que j'ai fait. en dessous c'est l'original
		//fname_ = rhs.fname_;
		//table_ = rhs.table_;
		//return *this;
	}


   String^ const %Filename()
   {
	   return fname_;
   }

   void Filename(String^ const %fname)
   {
	   //fname_ = fname;
	   //table_.clear();
	   return m_Afgen->Filename(fname);
   }

	  
	   cliext::map<double, double> const %Table() /*const*/ {return table_;}

	   void MemoriseTable();
	   void ForgetTable() {table_.clear();}
	   void LookUp(double const %key, double %val,[System::Runtime::InteropServices::DefaultParameterValueAttribute("TABLE_IN_MEMORY")] TableSource source) /*const*/;
	   bool operator()(double const %key, double %val, [System::Runtime::InteropServices::DefaultParameterValueAttribute("TABLE_IN_MEMORY")] TableSource source) /*const*/;
	};
}#endif
 

Je n'arrive pas à wrapper la surcharge de l'opérateur = ainsi que les 2 méthodes Filename. Ce que je souhaite c'est que lors de l'utilisation de cette classe en c# j'utilise les méthodes de ma classe native. Donc utiliser mon pointeur sur ma classe native :
m_afgen->Methode native(someparameters) 

Je ne m'en sort pas. Si vous aviez des pistes pour savoir où je fais pas bien les choses ? car il est clair que je me perds à un moment mais où ?
Par avance merci !
dodo
@pluche
Afficher la suite 

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.