2013-07-17 2 views
0

C++에서 C++/CX로 전환하는 과정에서 ref 클래스가 공개 멤버 또는 보호 된 멤버이므로 Java 및 가능한 오류로 인해 원시 멤버가있을 수 없었습니다. 대신 우리는 이제 만들 수있는 속성을 사용해야 만하지만 1 개의 값을 보유 할 수 있습니다 ...값을 저장하는 속성을 올바르게 만드는 방법은 무엇입니까?

아이디어는 배열이나 벡터에 4 개의 부동 소수점을 저장하고 나중에 값을 XMVECTOR로 전달하는 것이 었습니다 . 지금까지 클래스 헤더 파일에있는 관련 코드는 다음과 같습니다

나중에 .cpp 파일에
public: 
property std::vector<float> num{ 
     void set(std::vector<float> e){ 
      NUM = e; 
     }; 
     std::vector<float> get(){ 
      return NUM; 
     }; 
    }; 
private: 
std::vector<float> NUM; 

내가 할 :

std::vector<float> g; 
g.pushback(3); 
num = g; 

나는 또한 텍스트 상자에 전달하는 문자열 만들기 (하지만 그것은 중요하지 않습니다). 결국 난 그냥 많은 유사한 오류를 얻을 ... 2 개의 오류는 다음과 같습니다

error C3986: 'set': signature of public member contains native type 'std::vector<_Ty>' 
error C3986: 'set': signature of public member contains native type 'std::allocator<_Ty>' 

내가 상상하는 유일한 것은 내가 문자열이나 벡터를 사용할 수 없다는 것입니다. 나는 플랫폼 :: 문자열이 존재한다는 것을 알고 있지만 벡터에 대해서는 무엇을 ??

답변

0

서명에 Windows::Foundation::Collections::IVector<float>^을 사용할 수 있습니다. 나는 컴파일러를 가지고 있지 않기 때문에 이것을 테스트 할 수 없었다.

3

표준 C++ 유형은 모든 WinRT 언어 예측 (C#/VB/JS)이 공유하는 통신 계층 인 WinRT ABI를 통해 투영 될 수 없습니다. Jagannath가 언급했듯이 컬렉션 인터페이스 (Windows::Foundation::Collections::IVector<T>)가 있습니다. 사전 유형 (IMap<K,V>) 및 다양한 반복자 및 지원 유형도 있습니다. 이들은 모든 언어에서 이해할 수 있지만 단지 인터페이스 일뿐입니다. 각 언어 프로젝션은 이러한 인터페이스를 구현하는 런타임 클래스 작성에 대한 책임이 있습니다. C++/Cx의 경우 이러한 ref 클래스는 <collection.h> 헤더에 있으며 Platform::Collections 네임 스페이스에 있습니다. Platform::Collections::Vector<T>Platform::Collections::Map<K,V>은 보조 저장소로 사용할 수있는 기본 유형입니다. 또한 Vector<T>std::vector<T>에서 이동식으로 구성 할 수 있습니다.

그러나 아직 C++ 유형이므로 Platform::Collections::Vector<T> 유형의 공용 속성을 만들 수는 없습니다. 대신 유형의 전용 멤버 변수가 사용되는 Windows::Foundation::Collection::IVector<T> 유형의 공용 속성을 만듭니다. 기본적으로

: 그 까다로운 얻을 수 있기 때문에이 속성 세터를 언급 피할

public: 
property Windows::Foundation::Collections::IVector<float>^ num{ 
     Windows::Foundation::Collections::IVector<float>^ get(){ 
      return NUM; 
     } 
    } 
private: 
Platform::Collections::Vector<float>^ NUM; 

(개인 형은 또한 IVector 될 필요하고 C++에서 온 경우에만 Platform::Collections::Vector 될 것입니다).

+0

감사합니다. Andy. 필자는 setter 함수의 값을 safe_casting하여이 작업을 수행했습니다. 당신을 위해서가 아니라면 나는 아마도 키보드에서 머리를 뭉개 버렸을 것입니다. –

0

안녕하세요 여러분, 제가이 코드를 게시 할 것이라고 생각 했으므로이 코드를 사용할 수있었습니다.

public: 
property Windows::Foundation::Collections::IVector<int>^ num{ 
    void set(Windows::Foundation::Collections::IVector<int>^ e){ 
     NUM = safe_cast<Platform::Collections::Vector<int>^>(e); 
    }; 
    Windows::Foundation::Collections::IVector<int>^ get(){ 
     return NUM; 
    }; 
}; 
private: 
Platform::Collections::Vector<int>^ NUM; 

을 그리고 .CPP의 코드는 파일 : 헤더 파일은 다음과 같이 간다

num = ref new Vector<int>; 
num->Append(5); 
num->Append(54); 
TextBox1->Text = num->GetAt(0).ToString() + "\n" + num->GetAt(1).ToString(); 

결과는 텍스트 상자에 값 5와 54을 쓴 것입니다.