Visual C++ CLR:使用非原始数据类型作为属性
Visual C++ CLR : Using non-primitive data types as attributes
在 Visual Studio 2013 年使用 Visual C++。
项目类型:"CLR Empty Project"
我正在尝试创建一个 class,其中包含数据类型 std::string
和 std::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 };
}
注:
- 我已经包含了数组和字符串
- 显示所有私有属性的错误。
- PlayableOperators 和 PlayableSetOperatorCount 仅使用它们的前两个元素进行初始化。这是有意的。
我的建议是,如果您要编写托管 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。
在 Visual Studio 2013 年使用 Visual C++。 项目类型:"CLR Empty Project"
我正在尝试创建一个 class,其中包含数据类型 std::string
和 std::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 };
}
注:
- 我已经包含了数组和字符串
- 显示所有私有属性的错误。
- PlayableOperators 和 PlayableSetOperatorCount 仅使用它们的前两个元素进行初始化。这是有意的。
我的建议是,如果您要编写托管 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 写为非托管 (
class foo
),则它的数据成员应使用非托管类型。
- 如果您要将此 class 写为非托管 (
如果您发现自己一直在使用 managed/unmanaged 转换,也许您需要将 class 写成另一个。或者考虑更改您的 class 定义,将 class 的职责拆分为托管和非托管 classes。