Como posso duplicar um objeto anonimamente em C ++-CLI?
-
20-09-2019 - |
Pergunta
Eu tenho um fluxo de dados que estão contidos em um System::Collections::Queue
. Minha fonte de dados pode gerar os mesmos dados para vários fluxos, mas, para isso, precisa duplicar os dados para cada um. Eu atualmente faço o seguinte:
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]);
}
}
Que funciona bem enquanto eu estou enviando MyData
objetos. Digamos que eu quero enviar MyOtherData
objetos também. Seria bom fazer algo mais genérico como este:
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]);
}
}
... mas isso não vai compilar porque:
1>.\DataGatherer.cpp(72) : error C3673: 'System::Object' : class does not have a copy-constructor
Então, é possível duplicar um objeto sem conhecer seu tipo? ..e se sim, como faço isso? :)
Solução
Ter ambos MyData
e MyOtherData
implemento ICloneable
, então mude AddDataToQueues
aceitar qualquer objeto que implemente o 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;
};
e depois ...
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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow