Visual C++ CLR:使用非原始数据类型作为属性

Visual C++ CLR : Using non-primitive data types as attributes

在 Visual Studio 2013 年使用 Visual C++。 项目类型:"CLR Empty Project"

我正在尝试创建一个 class,其中包含数据类型 std::stringstd::array 的私有属性。

编译器给我以下错误:

"a member of a managed class cannot be of a non-managed class type"

我进行的研究使我相信 CLR 项目只允许使用原始数据类型作为 class 属性。
不幸的是,我一直无法找到解决办法。

.h 文件中给出了错误。我复制了下面的 .h 文件:

{
public:

PlayableSet();
~PlayableSet();

bool verifySolutionSet(std::string solution);

std::array<int, 5> getPlayableIntegers();
std::array<char, 4> getPlayableOperators();
std::string getPlayableString();
std::array<int, 9> getPlayableSetIntegerCount();
std::array<int, 4> getPlayableSetOperatorCount();

private:

const static std::array<char, 4> OPERATOR_ARRAY ;
std::array<int, 5> PlayableIntegers;
std::array<char, 4> PlayableOperators = { '+', '-' };
std::string PlayableString = "";
std::array<int, 9> PlayableSetIntegerCount;
std::array<int, 4> PlayableSetOperatorCount = { 1, 1 }; 
}

注:

我的建议是,如果您要编写托管 class,请编写托管 class。如果您要编写非托管 class,请编写非托管 class。

C++/CLI 允许混合使用托管代码和非托管代码,但有一些限制。在编写单个 class 的 定义时,您通常希望坚持使用其中之一。

  • 如果您要编写托管 class,请编写托管 class。
    • 如果您要将此 class 写为托管 (public ref class foo),则它的数据成员应使用托管类型。如果您需要使用非托管类型访问 class,请在 accessor/mutator 方法中转换 to/from 托管类型。
    • 在这种情况下,这将是 System::String^cli::array<int>^ foo = gcnew cli::array<int>(length)List<int>^ foo = gcnew List<int>()
  • 如果您要编写非托管 class,请编写非托管 class。
    • 如果您要将此 class 写为非托管 (class foo),则它的数据成员应使用非托管类型。

如果您发现自己一直在使用 managed/unmanaged 转换,也许您需要将 class 写成另一个。或者考虑更改您的 class 定义,将 class 的职责拆分为托管和非托管 classes。