0 / 0 / 0
Регистрация: 14.11.2016
Сообщений: 23
1

Виртуальные функции

25.10.2017, 00:53. Показов 601. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Есть задание. Если коротко, то нужно транспонировать матрицу используя ооп. Должно быть наследование и в производном классе реализовать само транспонирование + использовать виртуальные функции. Мои наброски

header.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
 
#include <iostream>
#include <iomanip>
 
using namespace std;
 
class Massiv
{
public:
    int enter(int **, int);
    virtual void transp(int**, int);
};
 
class PrMassiv :public Massiv
{
    int n, **mt;
 
public:
    PrMassiv(int);
    ~PrMassiv();
    virtual void transp(int**, int);
};
source1.cpp
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
#include "Header.h"
 
int Massiv::enter(int **m, int number)
{
    for (int i = 0; i < number; i++)
        for (int j = 0; j < number; j++)
            cin >> m[i][j];
 
    return **m;
}
 
PrMassiv::PrMassiv(int number)
{
        mt = new int*[number];
        for (int i = 0; i < number; i++)
            mt[i] = new int[number];
}
 
void PrMassiv::transp(int** m, int number)
{
    n = number;
 
    for (int i = 0; i < number; i++)
        for (int j = 0; j < number; j++)
            mt[i][j] = m[j][i];
}
 
PrMassiv::~PrMassiv()
{
    for (int i = 0; i < n; i++)
        delete[] mt[i];
    delete[] mt;
    mt = NULL;
}
source.cpp
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
#include "Header.h"
 
int main()
{
    int number, **m;
 
    cout << "row & col: ";
    cin >> number;
 
    m = new int*[number];
    for (int i = 0; i < number; i++)
        m[i] = new int[number];
 
    Massiv Mas;
 
    cout << "\nEnter massiv:\n";
    Mas.enter(m, number);
 
    for (int i = 0; i < number; i++)
        for (int j = 0; j < number; j++)
            cout << m[i][j];
 
    PrMassiv PrMas();
 
    Massiv *p;
 
    p = &PrMas;
    p->transp(m, number);
 
    for (int i = 0; i < number; i++)
        delete[] m[i];
    delete[] m;
    m = NULL;
 
    system("pause");
 
    return 0;
}
Вроде бы делал все по методе. Проблема возникла в функции main (файл source.cpp) в 27 строке. Может есть у кого какие-нибудь соображения по данному поводу?)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2017, 00:53
Ответы с готовыми решениями:

Виртуальные и чисто виртуальные функции
Чем они отличаются?? если можно, с примерами. И как из виртуальной функции сделать чисто...

Виртуальные функции
Объясните строку 106 И еще, почему перед каждой x1 x2 y стоит звездочка. Я вроде понимаю что это...

Виртуальные функции
Здрасте! вот задачка, какбэ сделал, но нужны виртуальные функции. даже не знаю как их сделать. ...

Виртуальные функции С++
Задача: В классе хранится целое, и определяется виртуальная функция shownum(). Создать 2...

6
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
25.10.2017, 01:46 2
Aleksej67, аргумент в конструктор добавить нужно. PrMassiv PrMas(0);

Добавлено через 38 минут
Aleksej67, как я понимаю у тебя в 23 строке объявление функции с прототипом PrMassiv PrMas();, в зоне видимости функции main
1
0 / 0 / 0
Регистрация: 14.11.2016
Сообщений: 23
25.10.2017, 02:09  [ТС] 3
_stanislav, получается, что в конструктор я передаю параметры (в прототипе и файле с самим алгоритмом), а при объявлении объекта ничего не передается. глупая ситуация. не уследил за своим кодом . но все равно спасибо вам)
0
_stanislav
25.10.2017, 02:29
  #4

Не по теме:

Цитата Сообщение от Aleksej67 Посмотреть сообщение
но все равно спасибо вам
в смысле я тебе не помог но все равно спасибо мне?

0
672 / 475 / 215
Регистрация: 06.09.2013
Сообщений: 1,306
25.10.2017, 05:43 5
Цитата Сообщение от Aleksej67 Посмотреть сообщение
Если коротко, то нужно транспонировать матрицу используя ооп
Скорее всего вам нужно, что-то вроде этого:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
 
// Абстрактная матрица
class Matrix {
public:
    virtual ~Matrix() {}
    virtual size_t getSize() const = 0;
    virtual int getItem(int i, int j) const = 0;
    virtual void setItem(int i, int j, int value) = 0;
    Matrix *transpose();
};
 
// Вывод матрицы на экран
std::ostream & operator<<(std::ostream &os, const Matrix &m) {
    for(size_t i = 0; i < m.getSize(); i++) {
        for(size_t j = 0; j < m.getSize(); j++)
            os << m.getItem(i, j) << " ";
        os << std::endl;
    }
    return os;
}
 
// Обычная матрица на основе массива
class ArrayMatrix : public Matrix {
protected:
    size_t mSize;
    int ** data;
public:
    ArrayMatrix(size_t mSize) : mSize(mSize) {
        data = new int*[mSize];
        for(size_t i = 0; i < mSize; i++)
            data[i] = new int[mSize];
    }
    virtual ~ArrayMatrix() {
        for(size_t i = 0; i < mSize; i++) delete data[i];
        delete data;
    }
    virtual size_t getSize() const;
    virtual int getItem(int i, int j) const;
    virtual void setItem(int i, int j, int value);
};
 
size_t ArrayMatrix::getSize() const {
    return mSize;
}
int ArrayMatrix::getItem(int i, int j) const {
    return data[i][j];
}
void ArrayMatrix::setItem(int i, int j, int value) {
    data[i][j] = value;
}
 
// Транспонированная матрица
class TransposedMatrix : public Matrix {
    Matrix *base;
public:
    TransposedMatrix(Matrix *base) : base(base) {}
    virtual size_t getSize() const;
    virtual int getItem(int i, int j) const;
    virtual void setItem(int i, int j, int value);
};
 
size_t TransposedMatrix::getSize() const {
    return base->getSize();
}
int TransposedMatrix::getItem(int i, int j) const {
    return base->getItem(j, i);
}
void TransposedMatrix::setItem(int i, int j, int value) {
    base->setItem(j, i, value);
}
 
// Собственно сам метод транспонирования
Matrix * Matrix::transpose()  {
    return new TransposedMatrix(this);
}
 
int main()
{
    Matrix* m = new ArrayMatrix(3);
    m->setItem(0, 0, 1); m->setItem(0, 1, 1); m->setItem(0, 2, 1);
    m->setItem(1, 0, 2); m->setItem(1, 1, 2); m->setItem(1, 2, 2);
    m->setItem(2, 0, 3); m->setItem(2, 1, 3); m->setItem(2, 2, 3);
 
 
    std::cout << "Исходная матрица: " << std::endl;
    std::cout << *m << std::endl;
 
    Matrix *t = m->transpose();
 
    std::cout << "Транспонированная матрица: " << std::endl;
    std::cout << *t << std::endl;
 
    delete t;
    delete m;
    return 0;
}
1
0 / 0 / 0
Регистрация: 14.11.2016
Сообщений: 23
25.10.2017, 16:17  [ТС] 6
_stanislav, ошибка была в том, что в конструктор не передавались аргументы
0
_stanislav
25.10.2017, 17:22     Виртуальные функции
  #7

Не по теме:

Цитата Сообщение от Aleksej67 Посмотреть сообщение
ошибка была в том, что в конструктор не передавались аргументы
да ну...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2017, 17:22

Виртуальные функции
Объясните, для чего необходимы виртуальные функции. Где их рационально использовать. P.S. Если...

Виртуальные функции
Создайте класс Word, определите в нем виртуальную функцию-член word_main(*char x), которая выводит...

виртуальные функции
Помогите пожалуйста, создать абстрактный класс Shape с двумя чисто виртуальными методами Area() и...

Виртуальные функции
Если в базовом классе А есть виртуальная функция show() перегруженная, то есть имеется три разные...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru