代码之家  ›  专栏  ›  技术社区  ›  Anzurio

如何在C++/CLI中模拟成员参考跟踪变量?

  •  1
  • Anzurio  · 技术社区  · 15 年前

    这将是一个非常愚蠢的问题,但是在C++/CLI中有可能做到以下几点吗?

    // C++/CLI
    public ref class Managed
    {
        public:
            array<double>^ m_data;
            Managed(array<double>^% data) : m_data(data)
            {
            }
    
            void bar(int x)
            {
                System::Array::Resize(m_data, x);
            }
    };
    // C#
    static void Main(string[] args)
    {
        double [] d = new double[10];
        Foo.Managed f = new Foo.Managed(d);
        f.bar(5);
    }
    

    这样, 之后 从main、main::d和f.m_调用f.bar(5)数据是相同的“重新分配”数组?我试过使用未管理的引用、指针、pin-ptr等等,但是什么都没有。有什么想法吗?如果这是不可能的,有什么原因吗?

    使用引用跟踪操作符(%)我可以这样做,如果我想在构造函数中调整大小,这就是它让我一直在尝试的方法。

    在C++中使用引用是可能的,不幸的是,我不知道如何将数组^转换成数组^ &;我也不能使用数组^ %作为成员:

    class Foo{
    public:
        double *& m_data;
        Foo(double*& data): m_data(data)
        {
        }
    
        void bar(int x)
        {
            delete m_data;
            m_data = new double[x];
        }
    
        ~Foo(){
            delete [] m_data;
        }
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        double* data = new double[10];
    
        Foo f(data);
        std::cout << &data << "\n" << &f.m_data << "\n";
        f.bar(5);
        std::cout << &data << "\n" << &f.m_data;
        getchar();
        return 0;
    }
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   itowlson    15 年前

    这是不可能的,因为引用是按值存储的:即,clr不支持by-ref成员字段。 (Eric Lippert discusses why here (around the second list of bullet points).) 因此,尽管d是通过引用传递到托管的构造函数中的,但当托管将其存储在m_数据中时,需要 复制 对MAIN的引用的大小为10的数组,而这个副本现在独立于原始数组。bar函数将f的m_数据引用(现在是main引用的独立副本)传递到array::resize中,后者修改m_数据以引用新的size-5数组。但是,因为M&U数据是一个 独立的 复制,这不会影响main.d——它仍然引用大小为10的数组。

    一种可能的替代策略是将数组引用封装在一个小的填充程序类中,并让主创建(和foo.managed accept)一个填充程序类的实例。然后,条可以调整垫片指向的数组的大小。因为main.d和f.m_数据仍然是对同一个填充程序的引用(因此将共享对实际数组的单个引用),main.d将看到调整大小的数组(通过填充程序)。