Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
#1

Template Method Pattern - C++

07.06.2012, 15:00. Просмотров 632. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2012, 15:00
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Template Method Pattern (C++):

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

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

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

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

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

Visual Studio выдаёт ошибку при вынесении объявления функции с template в .h файл. Без template всё работает - C++
Проект содержит три файла: Source.cpp, arrTreat.h, arrTreat.cpp. Source.cpp: #include &lt;iostream&gt; using std::cout; using...

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

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

" задаёт порядок выполнения действий" хм прикольно, спасибо...
Зачем эти функции вообще делать протектед или приват, чтоб нельзя было их по отдельности вызвать что ли ???
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.06.2012, 16:26 #8
Цитата Сообщение от Leeto Посмотреть сообщение
чтоб нельзя было их по отдельности вызвать что ли ???
Да, именно для этого. Но это не обязательно. Но для шаблонного метода, как правило, их нужно не открытыми делать.
1
07.06.2012, 16:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2012, 16:26
Привет! Вот еще темы с ответами:

MSVC и template template classes - C++
Приветствую. Как в MSVC передать template template класс? Простой пример template&lt;template&lt;typename, typename&gt; class Return&gt; ...

Не пойму конструкцию template <template <class T> class X> - C++
Что это за шаблон такой?

Friend template class with template class argument - C++
Помогите подружить 2 класса: Имеется класс Student: template &lt;class _T&gt; class Faculty; class Student{ friend...

strategy pattern - C++
Как можно понять етот пример? а т.е. ведь метод DoAlgorithm(); не может быть вызван в этом месте: theStrategy.DoAlgorithm() ; И зачем нам...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru