سؤال

ولدي تيار من البيانات التي ترد في 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

وهكذا هل من الممكن لتكرار كائن دون معرفة نوعه؟ .. و إذا كان الأمر كذلك، كيف أفعل ذلك؟ :)

هل كانت مفيدة؟

المحلول

وعلى حد سواء MyData وMyOtherData تنفيذ 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]);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top