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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ С клавиатуры вводится выражение вида с ор с (с-цифра, ор-знак операции). Вычислить значение выражения. Использовать оператор вариантов. http://www.cyberforum.ru/cpp-beginners/thread169322.html
Буду благодарен!=(( 1. С клавиатуры вводится выражение вида с ор с (с-цифра, ор-знак операции). Вычислить значение выражения. Использовать оператор вариантов. 2. Вывести на экран второго и шестандцатую эквиваленты целого числа. Не использовать спецификатор типа% х,% Х в функции printf.
C++ Операции с векторами и матрицами а) Написать программу, которая выполняет следующую операцию : Q = X +3*Y Где X, Y, Q – векторы размером 20x1. Все элементы векторов X і Y заполнить единицами. Также программа должна предлогать ввод X и Y. б) Создать программу, которая выполняет следующую операцию: Q = МА*Х где МА – матрица размером 10х10; X, Q – векторы размером 10x1. Все элементы матрицы МА и вектора X заполнить... http://www.cyberforum.ru/cpp-beginners/thread169316.html
Вопрос по программе. Нужно протабулировать ф-цию C++
Приветствую вас дамы и господа Тут такое дело... Задание: Код: # include <iostream.h> # include <conio.h> # include <math.h>
Экстремумы Матрицы и Подпрограммы C++
Здраствуйте помогите пожалуйста с задачками на С++! 1) Вычислите результат, указанный в варианте задания. Константа A (если она есть в варианте) и вектора X и (или) Y задаются вводом. Размер векторов X и Y одинаков и равен n. Если экстремальное значе¬ние повторяется, а надо найти его номер, считайте результатом номер первого порядку экстремума. В каждой из матриц A (4×3), B (5×4) поменять...
C++ класс. ввод данных http://www.cyberforum.ru/cpp-beginners/thread169296.html
Есть класс. У каждого имени - свое числовое значение. Нужно сделать так, чтобы после заполнения поля "имя" вылазило типа этого: "Сколько у этого человека будет значений?", ввести эти значения, и потом все снова: "имя", несколько значений, их ввод и т.д Т.е. полсе каждого ввода имени я самостоятельно хочу решать: сколько у этого человека будет значений и, соответсвенно, вводить их. class bank...
C++ Удаление цифр из символьной строки Доброго всем времени суток :) Такая задача: на языке C нужно составить программу удаления из строки символов только цифры. Например, строка "dfg546sv435", должно получиться "dfgsv". Поможете? подробнее

Показать сообщение отдельно
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
26.09.2010, 04:17     Абстрактный шаблонный класс
Ты задал два разных вопроса.

Первый ты уже похоже разрешил. Только я бы сделал вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<class T2>
std::ostream& operator <<(std::ostream& os, const Matr<T2>& Ob)
{
    Ob.output(os);
    return os;
}
 
template<class T2>
std::istream& operator >>(std::istream& is, Matr<T2>& Ob)
{
    Ob.input(is);
    return is;
}
Соответственные виртуальные функции - input(istream &) и output(ostream &). Никаких френдов не надо. И определять operator<< и >> для ColsoleMatr тоже не надо.

Второй вопрос достаточно интересен. Начнём с того, что возвратить по-значению абстрактный класс ты не сможешь. А операторы принципиально возвращают по-значению, поэтому нужно что-то менять.

Решается это через идиому handle/body. Идея такая:
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
class MatrBase  // абстракный
{
public:
    virtual ~MatrBase() = 0 {}
 
    virtual
    MatrBase * clone() const = 0;  // клонируем себя
 
    void mult_op(MatrBase const * other)
    {
        // умножить *this на *other используя интерфейс MatrBase
    }
};
 
class ConsoleMatr : public MatrBase  // конкретный
{
public:
    ConsoleMatr * clone() const
    {
        return new ConsoleMatr(*this);
    }
};
 
class Matr  // handle
{
public:
    Matr(MatrBase * body) : m_body(body) {}
    ~Matr() { delete m_body; }
 
    Matr operator*(Matr const & other) const
    {
        MatrBase * product = other.m_body->clone();
        product->mult_op(m_body);
        return Matr(product);
    }
private:
    MatrBase * m_body;
};
 
Текущее время: 06:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru