不在托管类中使用数组作为成员变量吗?

时间:2013-09-19 18:19:26

标签: arrays class visual-c++ c++-cli

我正在为民意调查编写一个程序,我使用的是“Partito”,

#pragma once

ref class Partito
{
protected:
    //System::String ^nome;
    int IndexP;             //Index Partito
    float MaxConsenso;
    float consensoTot;
    int consenso;
//workaround according to Hans Passant:
//  char Risposta[5];           
    array<int> ^Risposte;// Risposte means anwers.
//workaround end
System::Drawing::Color colore;

public:
    Partito(
        int _IndexP,
      float _consensoTot, int consenso

        array<int> ^_Risposte      // workaround

);      //costruttore

    void CalcCons(int consenso);

    float GetConsensoTot(void);
};
    };

现在定义:

#include "StdAfx.h"
#include "Partito.h"

//Partito::Partito(void)
Partito::Partito(
              int _IndexP,
            float _consensoTot,
            int consenso
//workaround start
            array<int> ^_Risposte //workaround
//workaround end
)
{
        //char Risposta[5]; 
//workaround start
     Risposte=gcnew array<int>(5); //workaround
    Risposte=_Risposte; //workaround
//workaround end.
    IndexP =_IndexP;
    consensoTot = _consensoTot;
    MaxConsenso = 12;
}
void Partito::CalcCons(int consenso)
{

consensoTot+=(consenso*100)/MaxConsenso;
}

float Partito::GetConsensoTot(void)
{
    return consensoTot;
}

现在,通过解决方法,编译器可以毫无问题地接受它。在文件“Form1h”中,我现在可以毫无问题地初始化数组:

Form1(void)
{
            InitializeComponent();
            //
            //TODO: aggiungere qui il codice del costruttore.
            //

我定义了一个对象,以这种方式对数组进行了初始化。

Partito^ ExampleParty = gcnew Partito(0,0,0,gcnew array<int>{0,1,2,2,0});
.
.
.
}

2 个答案:

答案 0 :(得分:2)

这段代码可以归结为一个简单的例子:

ref class foo {
public:
    int array[6];   // C4368: mixed types are not supported
};

这里发生了什么是C ++ / CLI编译器,可以让您免于拍摄腿部。一个看起来像这样的镜头:

foo^ obj = gcnew foo;
NativeFunction(obj->array, 6);

NatievFunction()将int *作为参数。当垃圾收集器启动时,这是致命的,就像NativeFunction()正在执行一样。当压缩堆时,它将移动内存中的foo对象。使int *无效。当本机函数现在读取垃圾或在写入数组时销毁GC堆时,会发生灾难。

变通方法是使用int *而不是int [],以便使用 new 运算符从本机堆分配数组的内存,从而始终保持稳定。在构造函数中分配它,您将需要一个析构函数和一个终结器来再次释放它。或者只使用托管数组,在这种情况下为array<int>^。你可以使用pin_ptr&lt;&gt;如果需要传递给本机函数,请暂时将其固定。

答案 1 :(得分:1)

您的char数组Riposta已在头文件中正确声明。您在构造函数中执行的操作是创建大小为Riposta的本地char数组Ndomande。虽然我不知道它来自哪里。