Форум программистов, компьютерный форум CyberForum.ru

Template Method Pattern - C++

Восстановить пароль Регистрация
 
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
07.06.2012, 15:00     Template Method Pattern #1
Задание называется Template Method Pattern. из параграфа полиморфизм.
Вообщем суть задания создать функцию Print() которая бы правильным образом обращалось бы или к одному дерайфт классу или к другому.
Меня смущает строчка
shapes[0]->Print(shapes[2]);
Как то криво это выглядит. Уверен можно как то по другому реализовать. Предыдущее задание было но абстрактные классы , мож это можно как то через ABC реализовать и типа сделать из Print() pure virtual base function. Как тогда это будет выглядеть в плане синтаксиса. Пожалуйста, помогите.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <string>
#include <iostream>
 
using namespace std;
 
 
class Shape
{
public:
    Shape() {}
    virtual void ToString() { cout <<  " Shape " << endl; }
    virtual ~Shape(){ } //!!!!
 
 
    virtual void  Print (Shape* s )  
    {
         s->ToString();
    }
};
 
class Point: public Shape
{
public:
    Point() {}
    Point(int x, int y): Shape()
    {
    }
     ~Point(){} //!!!!
    virtual void ToString() { cout <<  " Point " << endl; }
};
 
class Line: public Shape
{
public:
    Line() {}
    Line(string str, const Point& pt1, const Point& pt2): Shape()
    {
    }
     ~Line(){} //!!!!
    virtual void ToString() { cout <<  " Line " << endl; }
};
 
int main()
{
    {
    Shape* shapes[3]; // Array of pointers to Shape
 
    shapes[0] = new Shape();
    shapes[1] = new Line ("line from array ", Point(1,22),Point(33,22));
    shapes[2] = new Point(11,44);
 
    cout << "using ToString function"  << endl;
    
    
 
    shapes[0]->Print(shapes[2]);
 
    for(int i=0; i < 3; i++)
    {
        delete shapes[i];
    }
    
}
    system ("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2012, 15:00     Template Method Pattern
Посмотрите здесь:

Template Method Pattern C++
C++ strategy pattern
.RAW to JPEG with Bayer Pattern C++
Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier C++
C++ MSVC и template template classes
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.06.2012, 15:49     Template Method Pattern #2
Цитата Сообщение от Leeto Посмотреть сообщение
Меня смущает строчка
Отлично, что смущает! Ты не потерян для общества!

Метод Print должен быть не виртуальным и открытым. Перегружать в дочерних классах его не нужно. Никаких аргументов принимать он не должен.
Метод ToString должен быть виртуальным и защищённым(или закрытым).
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
07.06.2012, 16:08  [ТС]     Template Method Pattern #3
Цитата Сообщение от Deviaphan Посмотреть сообщение
Отлично, что смущает! Ты не потерян для общества!

Метод Print должен быть не виртуальным и открытым. Перегружать в дочерних классах его не нужно. Никаких аргументов принимать он не должен.
Метод ToString должен быть виртуальным и защищённым(или закрытым).
Ты не потерян для общества!
ух а то я испугался уже

Добавлено через 8 минут
Цитата Сообщение от Leeto Посмотреть сообщение
Ты не потерян для общества!
ух а то я испугался уже


Нет все таки потерен... блин не получается ((( черкони хоть пару строк ) что то как то с ошибкой у меня вылетает
компилятор пишет ворминг , но пропускает :
1> main.cpp
1>c:\all my\с++\ha level 5\solution\3.5_polymorphism\help project ex5 template\main.cpp(19): warning C4700: uninitialized local variable 's' used
1> Help Project ex5 Template.vcxproj -> C:\all my\с++\HA level 5\Solution\3.5_Polymorphism\Debug\Help Project ex5 Template.exe
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

а прога вылетает с надпись :
Run-Time Check Failure #3 - The variable 's' is being used without being initialized.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <string>
#include <iostream>
 
using namespace std;
 
 
class Shape
{
 
protected: 
    virtual void ToString() { cout <<  " Shape " << endl; }
 
public:
    Shape() {}
    virtual ~Shape(){ } //!!!!
    void Print ()  
    {   
        Shape* s;
        s->ToString();
    }   
};
 
class Point: public Shape
{
public:
    Point() {}
    Point(int x, int y): Shape()
    {
    }
     ~Point(){} //!!!!
    void ToString() { cout <<  " Point " << endl; }
};
 
class Line: public Shape
{
public:
    Line() {}
    Line(string str, const Point& pt1, const Point& pt2): Shape() {}
     ~Line(){} //!!!!
    void ToString() { cout <<  " Line " << endl; }
};
 
int main()
{
    {
    Shape* shapes[3]; // Array of pointers to Shape
 
    shapes[0] = new Shape();
    shapes[1] = new Line ("line from array ", Point(1,22),Point(33,22));
    shapes[2] = new Point(11,44);
 
    cout << "using ToString function"  << endl;
    
    
 
    shapes[0]->Print();
 
    for(int i=0; i < 3; i++)
    {
        delete shapes[i];
    }
    
}
    system ("pause");
    return 0;
}
и что значит не перегружать в диревативных классах ? мне же надо чтоб они ToString выводил мне или "point" or "line " string а без этого он мне только "shape " будет выводить ?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.06.2012, 16:14     Template Method Pattern #4
Ошибка тут (вернее, тут без ошибки и сравни стем, что у тебя):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Shape
{
 
protected: 
    virtual void ToString() { cout <<  " Shape " << endl; }
 
public:
    Shape() {}
    virtual ~Shape(){ } //!!!!
    void Print ()  
    {   
        ToString();
    }   
};
Добавлено через 1 минуту
Цитата Сообщение от Leeto Посмотреть сообщение
shapes[0]->Print();
Если нужно напечатать как в исходном примере, то shapes[2]->Print();
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
07.06.2012, 16:17  [ТС]     Template Method Pattern #5
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ошибка тут (вернее, тут без ошибки и сравни стем, что у тебя):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Shape
{
 
protected: 
    virtual void ToString() { cout <<  " Shape " << endl; }
 
public:
    Shape() {}
    virtual ~Shape(){ } //!!!!
    void Print ()  
    {   
        ToString();
    }   
};
Добавлено через 1 минуту

Если нужно напечатать как в исходном примере, то shapes[2]->Print();
Все как то мега тривиально получается в реализации...
В а этом вообще смысл есть??? прикладной ... так функцию в функцию заворачивать ??? и почему такое модное название (имею ввиду "Template Method Pattern") не мог бы ты пояснить в трех словах, пожалуйста...
ведь так же по стрелочки можно напрямую ToString вызывать если ее протектед не делать ????
и зачем ее(ToString) вообще делать протектед или приват ???
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.06.2012, 16:19     Template Method Pattern #6
Ну и чтобы распробовать вкус этого паттерна такого кода недостаточно будет.
Вот если будет типа такого кода, то вся соль прочувствуется
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Shape
{
protected:
     virtual void Func1();
     virtual void Func2();
     virtual void Func3();
 
public:
     void Call()
     {
           Func1();
           Func2();
           Func3();
     }
};
 
// тут дочерние с перегрузками
Добавлено через 1 минуту
Т.е. "шаблонная функция" задаёт порядок выполнения действий, а реализация этих действий выполняется в дочерних классах. Т.е. в данном примере, шаблонная функция гарантирует, что сперва вызовится Func1, потом Func2 и только потом Func3.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
07.06.2012, 16:21  [ТС]     Template Method Pattern #7
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ну и чтобы распробовать вкус этого паттерна такого кода недостаточно будет.
Вот если будет типа такого кода, то вся соль прочувствуется
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Shape
{
protected:
     virtual void Func1();
     virtual void Func2();
     virtual void Func3();
 
public:
     void Call()
     {
           Func1();
           Func2();
           Func3();
     }
};
 
// тут дочерние с перегрузками
Добавлено через 1 минуту
Т.е. "шаблонная функция" задаёт порядок выполнения действий, а реализация этих действий выполняется в дочерних классах. Т.е. в данном примере, шаблонная функция гарантирует, что сперва вызовится Func1, потом Func2 и только потом Func3.

" задаёт порядок выполнения действий" хм прикольно, спасибо...
Зачем эти функции вообще делать протектед или приват, чтоб нельзя было их по отдельности вызвать что ли ???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2012, 16:26     Template Method Pattern
Еще ссылки по теме:

C++ Не пойму конструкцию template <template <class T> class X>
Ошибка компиляции: template-id does not match any template declaration C++
'MyQueue' : use of class template requires template argument list C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.06.2012, 16:26     Template Method Pattern #8
Цитата Сообщение от Leeto Посмотреть сообщение
чтоб нельзя было их по отдельности вызвать что ли ???
Да, именно для этого. Но это не обязательно. Но для шаблонного метода, как правило, их нужно не открытыми делать.
Yandex
Объявления
07.06.2012, 16:26     Template Method Pattern
Ответ Создать тему
Опции темы

Текущее время: 13:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru