如何在C ++ - CLI中匿名复制对象?

时间:2010-02-12 11:23:39

标签: oop c++-cli copy-constructor

我有一个包含在System::Collections::Queue中的数据流。我的数据源可以将相同的数据输出到多个流但是为了这样做,需要复制每个数据的数据。我目前正在执行以下操作:

void DataGatherer::AddMyDataToQueues(MyData^ data)
{
    // Send duplicates to all queues
    for( int i = 0; i < m_outputQueues->Count; i++ )
    {
        AddResultToQueue(gcnew MyData(data), (Queue^)m_outputQueues[i]);
    }
}

只要我发送MyData个对象,它就能正常工作。假设我也想发送MyOtherData个对象。做这样更通用的事情会很好:

void DataGatherer::AddDataToQueues(Object^ obj)
{
    // Send duplicates to all queues
    for( int i = 0; i < m_outputQueues->Count; i++ )
    {
        AddResultToQueue(gcnew Object(obj), (Queue^)m_outputQueues[i]);
    }
}

...但这不会编译,因为:

1>.\DataGatherer.cpp(72) : error C3673: 'System::Object' : class does not have a copy-constructor

那么可以在不知道其类型的情况下复制对象吗? ..如果是的话,我该怎么做? :)

1 个答案:

答案 0 :(得分:1)

MyDataMyOtherData同时实现ICloneable,然后更改AddDataToQueues以接受实现ICloneable的任何对象。

public ref class MyOtherData : public ICloneable
{
public:
    MyOtherData()
        : m_dummy(-1)
    {
    }

    virtual Object^ Clone()
    {
        MyOtherData ^clone = gcnew MyOtherData();
        clone->m_dummy = m_dummy;
        return clone;
    }

private:
    int m_dummy;
};

然后......

void DataGatherer::AddDataToQueues(ICloneable^ data)
{
    // Send duplicates to all queues
    for( int i = 0; i < m_outputQueues->Count; i++ )
    {
        AddResultToQueue(data->Clone(), (Queue^)m_outputQueues[i]);
    }
}