2

に含まれるデータのストリームがあります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

では、型を知らなくてもオブジェクトを複製することは可能でしょうか? ..もしそうなら、どうすればいいですか?:)

4

1 に答える 1

1

との両方MyDataMyOtherData実装してから、 ICloneable を実装する任意のオブジェクトを受け入れるようICloneableに変更します。AddDataToQueues

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]);
    }
}
于 2010-02-13T11:43:57.140 に答える