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

Template Method Pattern

07.06.2012, 15:00. Показов 1149. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru