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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2012, 15:38   #11
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_Bers
Цитата:
Дано: Есть класс, имеющий шаблонный метод.
Требуется: в хэдере класса только прототипы методов, реализации - в cpp
на это я тебе ответил в своем первом посте.

метод Connect класса CTest не удовлетворяет ТВОИМ ЖЕ ВЫШЕНАЗВАННЫМ УСЛОВИЯМ.

на второй вопрос ты не ответил
Код:
Gen_Declarate(void, Work)(Gen_ptr);
что это за хрень?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 01.02.2012, 15:46   #12
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

А вот, люди добрые, подсказали более интересное решение.
Я бы сказал, это уже на целый паттерн тянет. Красиво придумано))

Это вот как раз пример того, что я и искал:


Код:
//Поставщик услуг теперь выглядит очень маленьким. 
//В нем больше нет ничего лишнего. Он никак не связан с потребителем.
// И даже не подозревает о его существовании.

#ifndef CWorker_h
#define CWorker_h

#include "ConstCode/Macross/AssertMessage.h"

class CWorker
{
public:
    CONTRACT(MYXA); //проверку контракта все равно оставил, 
                    //дабы что ни попадя ничайно через template не пробралось
    void Work();            
     int Work2(int val1, int val2);    
};
#endif
Код:
//Реализация потребителя:
#include "CWorker.h"
#include <iostream>

void CWorker::Work() { std::cout<< "Победа!\n"; }
int CWorker::Work2(int val1, int val2) 
{ 
    std::cout<< "Val1 = "<< val1<<"Val2 = "<< val2<<std::endl;
    return val1*2; 
}
Код:
Потребитель:
#ifndef CTest2_h
#define CTest2_h

#include "ConstCode/Macross/AssertMessage.h"

#include "TConnector.h"  //Альтернатива макросам. 
                                  //Не содержит деталей реализации.

//Коннектор - вещь, которая тянет на целый паттерн ИМХО.
//Прост и тривиален, он позволяет прятать любые шаблоны.

class CTest2
{
public:
    ~CTest2();
public:
    template<class tAgent>  void Connect(tAgent& val)      
    {   
        CHECK_CONTRACT(val, MYXA); //проверку контракта все равно оставил, 
                                   //дабы что ни попадя ничайно через template не пробралось
        
        pConnect = new TConnector<tAgent>(val); //путь пока так будет
    }
public:
    void Work(); 
private:
    IConnector* pConnect;  //а вот теперь самое прикольное.
};
Код:
//реализация потребителя.
//Видно, что благодаря коннектору, обычные методы класса получили возможность
//толкать методы поставщика услуг

#include "CTest2.h"

CTest2::~CTest2()   {  delete pConnect;  pConnect=0; }
void CTest2::Work() {  pConnect->Work(); pConnect->Work2(33,45); }
Ну и самое вкусное:
Код:
#ifndef TConnector_h
#define TConnector_h

//Идея пренадлежит Try с GameDef
//01.02.2012

class IConnector 
{  
public: 
    virtual void Work() = 0; 
    virtual int Work2(int val1, int val2)=0;    
};

template<class tOwner>
class TConnector:public IConnector
{
public:
    TConnector( tOwner& Owner ): pOwner(&Owner){}
public:
    void Work() {   pOwner->Work(); }
    int Work2(int val1, int val2) {  return pOwner->Work2(val1, val2); }
private:
    tOwner* pOwner;
};

#endif
Осталось допилить его малость. Можно проверку контракта перенести в сам коннектор. Ну и тп
_Bers вне форума Ответить с цитированием
Старый 01.02.2012, 15:51   #13
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2_Bers
на это я тебе ответил в своем первом посте.
Твой ответ не содержал решения задачи.

Цитата:
Сообщение от pproger Посмотреть сообщение
метод Connect класса CTest не удовлетворяет ТВОИМ ЖЕ ВЫШЕНАЗВАННЫМ УСЛОВИЯМ.
Мне не удалось полностью убрать реализацию шаблонного метода. Однако, мне удалось извлечь из него все подробности того, для чего и как вообще будет поставшик услуг использован.

Другими словами, в таком виде, шаблонный метод уже ничего не расскажет о деталях реализации класса в целом.
Ничего не расскажет, для чего понадобился поставщик услуг.

Цитата:
Сообщение от pproger Посмотреть сообщение
на второй вопрос ты не ответил
Код:
Gen_Declarate(void, Work)(Gen_ptr);
что это за хрень?
Это макрос обычный. Подставляет тексты туда сюда. Поскольку код возникает только времени компиляции, ассистенты их не палят.

Что там на самом деле скрывается - знать не обязательно, и не положено. В общем он и не мешает. Единственное, чего я не смог избежать - как вообще избавиться от данной записи.

Не получилось, из-за того, что нельзя в аргумент макроса запихать список аргументов функции. К сожалению.

Последний раз редактировалось _Bers; 01.02.2012 в 15:55.
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разнести данные в заготовленные шаблоны по критериям Proha Microsoft Office Excel 5 02.03.2011 21:22
Статические члены класса _-Re@l-_ Общие вопросы C/C++ 8 20.01.2011 23:18
члены последовательности amikulia Помощь студентам 0 14.01.2011 12:35
наибольший и последний члены Zhasik Паскаль, Turbo Pascal, PascalABC.NET 1 27.12.2010 08:53
Static члены assasin Общие вопросы C/C++ 2 21.08.2009 10:54