2015-01-15 3 views
1
나는 다음과 같은 네이티브 C 내 C++/CLI 래퍼를 완료하고

++ 클래스 :는 C++/CLI 래퍼 - C++ 단독 인스턴스

#ifndef __TV3DENGINE_H__ 
#define __TV3DENGINE_H__ 
#pragma once 

#include "TV3DMoteur.h" 
#include "Input.h" 
#include "Area.h" 
#include <vcclr.h> 

class Engine3D 
{ 
public: 
    CLTV3DMoteur* clTV3D; 
    CLInput* clInput; 
    CLArea* clArea; 
    CLGlobalVar * clGlobalVar; 

    Engine3D(); 
    ~Engine3D(); 

    void Setup(HWND TVScreenHWND, string PathString); 
    void UpdateLoop(); 
    void Cleanup(); 
    bool AppStillIdle(); 

    CLTV3DMoteur* GetTV3D(); 
    CLInput* GetInput(); 
    CLArea* GetArea(); 
    CLGlobalVar * GetGlobalVar(); 
}; 
#endif 

Engine3D의 실제 생성자는 다음과 같습니다

Engine3D::Engine3D() 
{ 
    clTV3D = CLTV3DMoteur::getInstance(); 
    clInput = CLInput::getInstance(); 
    clArea = CLArea::getInstance(); 
    clGlobalVar = CLGlobalVar::getInstance(); 
} 

#ifndef __WRAPPER_H__ 
#define __WRAPPER_H__ 
#pragma once 
#include "TV3DEngine.h" 
#include <msclr\marshal_cppstd.h> 


public ref class Engine3DWrapper { 
    Engine3D* m_nativeClass; 

public: 
    Engine3DWrapper() { m_nativeClass = new Engine3D(); } 
    ~Engine3DWrapper() { delete m_nativeClass; } 
    void Setup(System::IntPtr tvscreen, System::String^ AppPath) { 
     System::String^ managedPath = AppPath; 
     m_nativeClass->Setup((HWND)tvscreen.ToInt32(), msclr::interop::marshal_as<std::string>(managedPath)); 
    } 
    void UpdateLoop() { 
     m_nativeClass->UpdateLoop(); 
    } 
    void Cleanup() { 
     m_nativeClass->Cleanup(); 
    } 
    bool AppStillIdle() { 
     return(m_nativeClass->AppStillIdle()); 
    } 

protected: 
    !Engine3DWrapper() { delete m_nativeClass; } 
}; 
#endif 

내 문제는 내가 래퍼 modifiy 수있는 방법 그래서, exemp에 액세스 할 수 있습니다 : 여기에 실제 래퍼입니다 le, Engine3DWrapper-> clGlobalVar-> BLABLABLA() 여기서 BLABLABLA는 CLGlobalVar C++ 싱글 톤에 정의 된 모든 다른 메소드입니까?

property String ^Name 
    { 
    String ^get() 
    { 
     return gcnew String(_stu->getName()); 
    } 
    } 

을하지만 정의 된 형식을 반환 할 필요가 없습니다 때문에 그 수없는 것 같다

나는이 기술을 통해 시도했다.

귀하의 도움에 감사드립니다.

+0

'Engine3DWrapper'에서'm_nativeClass-> GetGlobalVar()'를 반환하는 새 멤버 함수를 만들지 않겠습니까? (또는 초기화 후'GetGlobalVar()'의 값을 저장하는'Engine3DWrapper' 내에'clGlobalVar'라는 새로운 멤버 변수를 만들 수 있습니다. – Rufflewind

+0

이것을 처리 할 수있는 몇 가지 방법이 있습니다. 당신은 다른 모델에 물건을 건네고 있습니다. 한 가지 방법은 자식 클래스를 삭제하지 않는 또 다른 래퍼가 될 "Handle"형식 클래스입니다. 또 다른 방법은 C++을 가비지 수집 소유권 (공유 포인터 사용)으로 옮기는 것입니다. – IdeaHat

+0

@Rufflewind : 처음 접근했지만 새로운 멤버 변수를 만들려면 어떤 유형을 사용해야하는지 차단했습니다. – Windrider

답변

1

문제가 해결되었습니다. 여기 는 Rufflewind 제안 다음 수정 래퍼입니다 : 당신이 도움을

CLGlobalVar *Engine3D::GetGlobalVar() 
{ 
    clGlobalVar = CLGlobalVar::getInstance(); 
    return(clGlobalVar); 
} 

감사 : 간단한 기본 클래스의 메소드를 가져 오기를 사용하여

#ifndef __WRAPPER_H__ 
#define __WRAPPER_H__ 
#pragma once 
#include "TV3DEngine.h" 
#include <msclr\marshal_cppstd.h> 


public ref class Engine3DWrapper { 
    Engine3D* m_nativeClass; 

public: 
    Engine3DWrapper(System::IntPtr tvscreen, System::String^ AppPath) 
    { 
     m_nativeClass = new Engine3D((HWND)tvscreen.ToInt32(), msclr::interop::marshal_as<std::string>(AppPath)); 
     m_TV3D = m_nativeClass->GetTV3D(); 
     m_Input = m_nativeClass->GetInput(); 
     m_Area = m_nativeClass->GetArea(); 
     m_GlobalVar = m_nativeClass->GetGlobalVar(); 
    } 
    ~Engine3DWrapper() { 
     delete m_nativeClass; 
    } 
    void UpdateLoop() { 
     m_nativeClass->UpdateLoop(); 
    } 
    void Cleanup() { 
     m_nativeClass->Cleanup(); 
    } 
    bool AppStillIdle() { 
     return(m_nativeClass->AppStillIdle()); 
    } 

    CLTV3DMoteur* m_TV3D; 
    CLInput* m_Input; 
    CLArea* m_Area; 
    CLGlobalVar* m_GlobalVar; 

protected: 
    !Engine3DWrapper() { delete m_nativeClass; } 
}; 
#endif 

!