Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2012, 16:36   #21
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Приведи минимально возможный, но компилируемый код.
Что бы можно было скопипастить, и сразу же запустить на выполнение.
_Bers вне форума Ответить с цитированием
Старый 16.12.2012, 16:58   #22
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

В общем, вот, смотри, изучай:

Код:
#include<typeinfo>
#include<iostream>
#include<vector>


    struct IObject
    {
        virtual ~IObject(){}
        virtual IObject* Clone()=0;
        virtual void Work()=0;
    };

    template<class T>struct TObject: IObject
    {
        TObject()
        {
            std::cout<<"TObject: was build with type: "<<typeid(T).name()<<'\n';
        }
        TObject(const TObject& rhs)
        {
            std::cout<<"TObject: was build by copy, with type: "<<typeid(T).name()<<'\n';
        }
        virtual void Work()
        {
            std::cout<<"TObject: working, with type: "<<typeid(T).name()<<'\n';
        }
        virtual ~TObject()
        {
            std::cout<<"TObject: destroyed, with type: "<<typeid(T).name()<<'\n';
        }
        virtual TObject* Clone() { return new TObject(*this);  }
    };

    struct DTObject: TObject<DTObject>
    {
        DTObject()
        {
            std::cout<<"DTObject: was build\n";
        }
        DTObject(const DTObject& rhs)
        {
            std::cout<<"DTObject: was build by copy\n";
        }
        virtual void Work()
        {
            std::cout<<"DTObject: working: "<<"Execute TObject<DTObject>::Work()\n";
            TObject<DTObject>::Work();
        }
        virtual ~DTObject()
        {
            std::cout<<"DTObject: destroyed\n";
        }
        virtual DTObject* Clone() { return new DTObject(*this);  }
    };

    struct CObject: IObject
    {
        CObject(){ std::cout<<"CObject: was build\n";  }
        CObject(const CObject& rhs) { std::cout<<"CObject: was build by copy\n";  }
        virtual void Work()               { std::cout<<"CObject: working\n";    }
        virtual ~CObject()       { std::cout<<"CObject: destroyed\n";  }
        virtual CObject* Clone() { return new CObject(*this);          }
    };

    struct Manager
    {
        ~Manager()
        {
            const size_t size = mObj.size();
            for(size_t n=0;n<size;++n){ delete mObj[n]; mObj[n] = 0l; }
        }

        void Connect(IObject* src){  mObj.push_back( src->Clone() ); }

        void Work()
        {
            const size_t size = mObj.size();
            for(size_t n=0;n<size;++n){ mObj[n]->Work(); }
        }
        std::vector<IObject*> mObj;
    };


int main()
{
   Manager man;
   IObject* agent1 = new TObject<int>();
   IObject* agent2 = new TObject<float>();
   IObject* agent3 = new CObject();
   IObject* agent4 = new DTObject();

   man.Connect(agent1);
   man.Connect(agent2);
   man.Connect(agent3);
   man.Connect(agent4);

   delete agent1;
   delete agent2;
   delete agent3;
   delete agent4;

   man.Work();

   return 0;
}

вывод в консоль:


Код:
TObject: was build with type: int
TObject: was build with type: float
CObject: was build
TObject: was build with type: struct DTObject
DTObject: was build
TObject: was build by copy, with type: int
TObject: was build by copy, with type: float
CObject: was build by copy
TObject: was build with type: struct DTObject
DTObject: was build by copy
TObject: destroyed, with type: int
TObject: destroyed, with type: float
CObject: destroyed
DTObject: destroyed
TObject: destroyed, with type: struct DTObject
TObject: working, with type: int
TObject: working, with type: float
CObject: working
DTObject: working: Execute TObject<DTObject>::Work()
TObject: working, with type: struct DTObject
TObject: destroyed, with type: int
TObject: destroyed, with type: float
CObject: destroyed
DTObject: destroyed
TObject: destroyed, with type: struct DTObject

Последний раз редактировалось _Bers; 16.12.2012 в 17:04.
_Bers вне форума Ответить с цитированием
Старый 17.12.2012, 16:09   #23
Lasor
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 67
По умолчанию

Всё получилось.
У меня "затык" был в том, что я никак не мог понять:
1. Надо прописывать конструктор копирования для каждого наследника от шаблонного класса.
2. Надо прописывать метод клонирования для каждого наследника от шаблонного класса.
Lasor вне форума Ответить с цитированием
Старый 17.12.2012, 22:16   #24
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Копирующий конструктор - по обстоятельствам.
А вот метод клонирования - если его не сделать для конкретного потомка, то через базовый интерфейс он уже не сможет отклонироваться.

Тут понимание простое: если у потомка реализован виртуальный метод интерфейса, то через базовый интерфейс этот метод и запустится.

Если не реализован - запустится первый попавшийся в иерархии предков, либо будет ошибка компиляции
_Bers вне форума Ответить с цитированием
Старый 17.12.2012, 22:28   #25
Lasor
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 67
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Копирующий конструктор - по обстоятельствам.
А вот метод клонирования - если его не сделать для конкретного потомка, то через базовый интерфейс он уже не сможет отклонироваться.

Тут понимание простое: если у потомка реализован виртуальный метод интерфейса, то через базовый интерфейс этот метод и запустится.

Если не реализован - запустится первый попавшийся в иерархии предков, либо будет ошибка компиляции
Огромное спасибо, что разъяснил.
У меня, как раз, и запускался сначала копирующий конструктор родителя-шаблона, а потом конструктор (почему-то не копирующий, а обыный, хотя копирующий был объявлен, но не определён) базового класса...
Lasor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание экземпляра класса biohazard120 Общие вопросы Delphi 11 15.09.2012 13:23
C#(перехват нового экземпляра класса StackOverflowException) Anett// Помощь студентам 0 12.05.2011 22:26
Освобождение памяти от экземпляра класса Mixim Общие вопросы .NET 8 05.01.2011 17:27
удаление экземпляра класса Juffin Общие вопросы Delphi 5 02.11.2010 11:57
ListBox, привязка экземпляра класса к Item. Возможно ли? Casper-SC Общие вопросы .NET 1 24.05.2010 10:40