none
关于类定义变量和Platform定义public变量函数问题 RRS feed

  • 问题

  • 本人新手请教
    问题1:我在项目中新增加了类A,在B类.h文件中写如下代码:
    #include"A.h"
    private:  A card[15];
    这样定义不会报错但是为什么调用时会报如下问题:error C1001: 编译器中发生内部错误。难道C++不允许这样定义使用么还是哪里写的问题?

    问题2:
    在A类中定义如下:
    property Platform::Collections::Vector<Object^> ^ imageCards1;
    我想在B类中调用
    结果报如下错:error C3986: “get”: 公共成员的签名包含本机类型“std::equal_to<_Ty>”
             with
            [
                  _Ty=Platform::Object ^
             ] (CardManager.cpp)

    如果定义如下则没问题:
    property std::vector<Object^> ^ imageCards1; 为什么只要是Platform定义的变量和函数都不能定义为public供其它类调用呢?还是需要添加其他.h文件?

    2012年6月11日 12:31

答案

  • 问题1和2 应该是同一个问题,首先你的A必须是WinRT的类型,否则是不能在其中创建属性的。然后你可以看下文档 http://msdn.microsoft.com/en-us/library/windows/apps/hh441569(v=vs.110).aspx  从中你就知道

    Collections are always passed across the ABI boundary as handles to Windows Runtime types, such as Windows::Foundation::Collections::IVector^ and Windows::Foundation::Collections::IMap^. For example, if you return a handle to a Platform::Collections::Map, it will implicitly convert to a Windows::Foundation::Collections::IMap^.

    应该是:

    public ref class A sealed
    {
    public:
      A();
    
      property Windows::Foundation::Collections::IVector<Object^> ^ imageCards1
      {
        Windows::Foundation::Collections::IVector<Object^> ^ get(){return _imageCards1;}
      }
    
    private:
      Windows::Foundation::Collections::IVector<Object^> ^ _imageCards1;
    };
    
    然后在你的B中,  A^ a = ref new A;即可。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 JJ李锋 2012年6月12日 8:47
    2012年6月12日 7:54
    版主
  • 自己回复下吧已经解决,解决如下:

    Platform::Array<A^>^ g_A;
      g_A= ref new Array<A^>(10);

    for(int i=0;i<10;i++)

    {

    g_card->get(i) = ref new Card();

    }

    g_card->get(0)->fun();

    2012年6月12日 10:24

全部回复

  • 关于问题2,就是说我怎么能在B类中调用A类中定义的Vector类型的变量呢?

    2012年6月12日 2:05
  • 问题1和2 应该是同一个问题,首先你的A必须是WinRT的类型,否则是不能在其中创建属性的。然后你可以看下文档 http://msdn.microsoft.com/en-us/library/windows/apps/hh441569(v=vs.110).aspx  从中你就知道

    Collections are always passed across the ABI boundary as handles to Windows Runtime types, such as Windows::Foundation::Collections::IVector^ and Windows::Foundation::Collections::IMap^. For example, if you return a handle to a Platform::Collections::Map, it will implicitly convert to a Windows::Foundation::Collections::IMap^.

    应该是:

    public ref class A sealed
    {
    public:
      A();
    
      property Windows::Foundation::Collections::IVector<Object^> ^ imageCards1
      {
        Windows::Foundation::Collections::IVector<Object^> ^ get(){return _imageCards1;}
      }
    
    private:
      Windows::Foundation::Collections::IVector<Object^> ^ _imageCards1;
    };
    
    然后在你的B中,  A^ a = ref new A;即可。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 JJ李锋 2012年6月12日 8:47
    2012年6月12日 7:54
    版主
  • 十分感谢BobBao!但是问题一我的意思是在B类中是否可以这么定义:

    A card[10];  把A类当做int类型使用 相当于 int card[10];只不过数组card可以调用A类中的变量。例如:

    A {

    public:

          fun();

    }

    定义了 A card[10];后 card[0]->fun();是有效的

    2012年6月12日 9:56
  • 自己回复下吧已经解决,解决如下:

    Platform::Array<A^>^ g_A;
      g_A= ref new Array<A^>(10);

    for(int i=0;i<10;i++)

    {

    g_card->get(i) = ref new Card();

    }

    g_card->get(0)->fun();

    2012年6月12日 10:24