Pregunta

Tengo un flujo de datos que está contenida en un System::Collections::Queue. Mi fuente de datos pueden dar salida a los mismos datos a múltiples flujos, pero para hacerlo, tiene que duplicar los datos para cada uno. Actualmente hago lo siguiente:

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]);
    }
}

Lo que funciona bien siempre y cuando estoy enviando objetos MyData. Digamos que quiero enviar objetos MyOtherData así sin embargo. Sería bueno hacer algo más genérico como esto:

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]);
    }
}

... pero eso no compilará porque:

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

Entonces, ¿es posible duplicar un objeto sin conocer su tipo? ..y si es así, ¿cómo lo hago? :)

¿Fue útil?

Solución

Haga que tanto MyData y MyOtherData implementan ICloneable, a continuación, cambiar AddDataToQueues a aceptar cualquier objeto que implementa 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;
};

y luego ...

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]);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top