С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для Leeto
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1

Template Method Pattern

07.06.2012, 15:00. Показов 1131. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание называется 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;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.06.2012, 15:00
Ответы с готовыми решениями:

Template Method Pattern
Где можно об этом почитать на русском нормальный материал ? Template Method Pattern

Pattern и template, в чём разница?
Приветствую!!! Сразу к делу, я понимаю, что шаблоны(template) - это образцы, которые могут обработать большинство идентичных задач. А...

Curiously Recurring Template Pattern; CRTP - почему это работает
Всем добрый вечер! Я задумался над тем почему и как работает CRTP в C++. #include &lt;iostream&gt; using std::cout; ...

7
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
07.06.2012, 15:49
Цитата Сообщение от Leeto Посмотреть сообщение
Меня смущает строчка
Отлично, что смущает! Ты не потерян для общества!

Метод Print должен быть не виртуальным и открытым. Перегружать в дочерних классах его не нужно. Никаких аргументов принимать он не должен.
Метод ToString должен быть виртуальным и защищённым(или закрытым).
1
 Аватар для Leeto
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
07.06.2012, 16:08  [ТС]
Цитата Сообщение от 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 " будет выводить ?
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
07.06.2012, 16:14
Ошибка тут (вернее, тут без ошибки и сравни стем, что у тебя):
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();
1
 Аватар для Leeto
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
07.06.2012, 16:17  [ТС]
Цитата Сообщение от 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) вообще делать протектед или приват ???
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
07.06.2012, 16:19
Ну и чтобы распробовать вкус этого паттерна такого кода недостаточно будет.
Вот если будет типа такого кода, то вся соль прочувствуется
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.
1
 Аватар для Leeto
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
07.06.2012, 16:21  [ТС]
Цитата Сообщение от 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.

" задаёт порядок выполнения действий" хм прикольно, спасибо...
Зачем эти функции вообще делать протектед или приват, чтоб нельзя было их по отдельности вызвать что ли ???
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
07.06.2012, 16:26
Цитата Сообщение от Leeto Посмотреть сообщение
чтоб нельзя было их по отдельности вызвать что ли ???
Да, именно для этого. Но это не обязательно. Но для шаблонного метода, как правило, их нужно не открытыми делать.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.06.2012, 16:26
Помогаю со студенческими работами здесь

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я прописываю тело функций внутри описания...

Template definition of non-template при использовании частичной спецификации шаблонов
Всем привет! Есть задача написать шаблон класса, принимающего в качестве параметров типа шаблон и некоторый тип. Собственно, вот код: ...

'MyQueue' : use of class template requires template argument list
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки 'MyQueue' : use of class template...

В чем различие template <typename T> от template <class T> ?
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template &lt;class T&gt; в чем же тогда фишка...

Ошибка компиляции: template-id does not match any template declaration
Здравствуйте. Помогите, пожалуйста: #include &lt;iostream&gt; using namespace std; template &lt;typename T&gt; T maxn(T*, const int*); ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru