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

Абстрактный шаблонный класс - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.83
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.09.2010, 03:22     Абстрактный шаблонный класс #1
Вообщем какое дело. У меня есть класс матрица, который сделан с использованием шаблонов и STL. В нем перегружены операторы ввода/вывода в поток(то, что их не врубить в динамический полиморфизм я уже понял).

Первый класс:

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
    //Класс матрицы
    template<class T>
    class Matr
    {
    public:
       Matr();
       Matr(size_t n, size_t m);
       Matr(const Matr&);
       virtual ~Matr();
       void SetSize(size_t n, size_t m);
       const size_t GetRow() const {return Matrix.size();}
       const size_t GetCol() const {return Matrix[0].size();}
       template<class T2>
       friend std::ostream& operator <<(std::ostream& os, const Matr<T2>& Ob);
       template<class T2>
       friend std::istream& operator >>(std::istream& is, Matr<T2>& Ob);
       Matr<T>& operator =(const Matr&);
       Matr<T> operator +=(const Matr&);
       Matr<T> operator +(const Matr&);
       Matr<T> operator *=(const Matr&);
       Matr<T> operator *(const Matr&);
       void random_fill();
    protected:
       std::vector<std::vector<T> > Matrix;
    };
Определение функций писать не буду, пока это не нужно. Вряд ли 200 строк чем-то помогут. Виртуальными эту перегрузку не сделать. И если я пишу второй код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class T>
class ConsoleMatr:public Matr<T>
{
public:
   ConsoleMatr():Matr() {}
   ConsoleMatr(size_t n, size_t m):Matr(n, m) {}
   ConsoleMatr(const Matr& Ob):Matr(Ob) {}
   template<class T2>
   friend std::ostream& operator <<(std::ostream& os, const ConsoleMatr<T2>& Ob);
   template<class T2>
   friend std::istream& operator >>(std::istream& is, ConsoleMatr<T2>& Ob);
};
И комментирую эти методы в исходном классе, то как реализовать динамический полиморфизм?

Пробую так.
C++
1
2
3
4
5
6
7
8
typedef std::auto_ptr<Matr<int> > MatrSP;
 
int main()
{
   MatrSP Ob(new ConsoleMatr);
   std::cin>>Ob;
   //
}
Пишет ошибку. Впринципе это понятно. Тогда вопрос, как реализовать??

А так же есть вариант оставить оба варианта. Но будут вызываться операторы ввода/вывода из класса Matr.

И следующий вопрос. Добавляю в первый класс две чисто виртуальные функции. Класс принимает вид:

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
    //Класс матрицы
    template<class T>
    class Matr
    {
    public:
       Matr();
       Matr(size_t n, size_t m);
       Matr(const Matr&);
       virtual ~Matr();
       void SetSize(size_t n, size_t m);
       const size_t GetRow() const {return Matrix.size();}
       const size_t GetCol() const {return Matrix[0].size();}
       template<class T2>
       friend std::ostream& operator <<(std::ostream& os, const Matr<T2>& Ob);
       template<class T2>
       friend std::istream& operator >>(std::istream& is, Matr<T2>& Ob);
       Matr<T>& operator =(const Matr&);
       Matr<T> operator +=(const Matr&);
       Matr<T> operator +(const Matr&);
       Matr<T> operator *=(const Matr&);
       Matr<T> operator *(const Matr&);
       void random_fill();
           virtual void input()=0;
           virtual void output()=0;
    protected:
       std::vector<std::vector<T> > Matrix;
    };
А второй.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class T>
class ConsoleMatr:public Matr<T>
{
public:
   ConsoleMatr():Matr() {}
   ConsoleMatr(size_t n, size_t m):Matr(n, m) {}
   ConsoleMatr(const Matr& Ob):Matr(Ob) {}
   template<class T2>
   friend std::ostream& operator <<(std::ostream& os, const ConsoleMatr<T2>& Ob);
   template<class T2>
   friend std::istream& operator >>(std::istream& is, ConsoleMatr<T2>& Ob);
   void input();
   void output();
};
Вот так впринципе вполне неплохо идет полиморфизм. Но есть одно НО...

Ошибка происходит в этой функции.

C++
1
2
3
4
5
6
7
    template<class T>
    Matr<T> Matr<T>::operator *(const Matr<T> &Ob)
    {
          Matr<T> Obj(*this);   
          Obj*=Ob;
          return Obj;
    }
Нельзя инстанцинировать абстрактный класс... Что тоже понятно... Но непонятно, как тогда это реализовать. Или же забить на это и оставить как есть?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2010, 03:22     Абстрактный шаблонный класс
Посмотрите здесь:

C++ Шаблонный класс
Переделать класс в шаблонный класс C++
C++ Шаблонный класс
Шаблонный класс C++
C++ Шаблонный класс
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.10.2010, 23:57  [ТС]     Абстрактный шаблонный класс #41
Показал преподавателю эту прогу. Ему очень даже понравилось. Дал несколько советов по стилю. Один из советов меня ввел несколько в ступор.

Определение функций шаблонного класса принято делать в самом этом классе. Т.е. как-то так.

Я конечно доверяю профессионалу с 15-летним стажем на С/C++ и прочих языках программирования, но мне это кажется странным. Почему так принято, кто-то может объяснить?

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
template <class T>
class Test
{
public:
    Test() 
    {
        a=0;
        b=0;
    }
    ~Test() {}
     Test(int a_, int b_)
     {
         a=a_;
         b=b_;
     }
     Test<T> operator +(const Test<T>& Ob) const
     {
          Test<T> Temp;
          Temp.a=a+Ob.a;
          Temp.b=b+Ob.b; 
          return Temp;
     }
private:
    int a;
    int b;
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
03.10.2010, 00:38     Абстрактный шаблонный класс #42
Lavroff, определение все-равно не отделимо от объявления (обычными способами), поэтому их разделение только усложнит код, видимо
в том же stl и у msvc, и у gcc все сплошняком
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.10.2010, 00:40  [ТС]     Абстрактный шаблонный класс #43
alex_x_x, Ну да. Если не брать в расчет экспорт шаблонов, который реализован только в одном компиляторе, и то насколько я понимаю криво.
Спасибо.
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
03.10.2010, 04:16     Абстрактный шаблонный класс #44
Цитата Сообщение от Lavroff Посмотреть сообщение
Определение функций шаблонного класса принято делать в самом этом классе.
Кто-то делает так, а кто-то и выносит из класса. Или можно маленькие функции в самом классе реализовывать, а большие вне. Когда вся реализация внутри класса, трудно увидеть интерфейс, так как он вперемешку с реализацией. Поэтому лучше не злоупотреблять сованием внутрь класса всего что можно.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
03.10.2010, 23:35     Абстрактный шаблонный класс #45
Цитата Сообщение от Lavroff Посмотреть сообщение
Показал преподавателю эту прогу. Ему очень даже понравилось. Дал несколько советов по стилю. Один из советов меня ввел несколько в ступор.

Определение функций шаблонного класса принято делать в самом этом классе. Т.е. как-то так.

Я конечно доверяю профессионалу с 15-летним стажем на С/C++ и прочих языках программирования, но мне это кажется странным. Почему так принято, кто-то может объяснить?
Это вроде бы из-за того,что не все компиляторы (по крайней мере,год назад) реализовывали директиву export для шаблонов,поэтому их нужно было всегда определять в заголовках.Вроде как оттуда пошло
И ещё возможно для того,чтобы шаблоны были доступны в момент копиляции. Если я что-то не так написал,профессионалы,поправьте,пожалуйста .
Lavroff, погляди в гугле ещё,там есть целая тема про это (ссылку давать не буду - зобанют )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2010, 23:41     Абстрактный шаблонный класс
Еще ссылки по теме:

Шаблонный класс C++
C++ Шаблонный класс
C++ шаблонный класс

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.10.2010, 23:41  [ТС]     Абстрактный шаблонный класс #46
#pragma, Ну да. Большинство так и не поддерживают export для шаблонов и неизвестно будут ли.
Yandex
Объявления
03.10.2010, 23:41     Абстрактный шаблонный класс
Ответ Создать тему
Опции темы

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