¿Cómo puedo duplicar un objeto de forma anónima en C ++ - CLI?
-
20-09-2019 - |
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? :)
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]);
}
}