Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
1

Нужен взгляд со стороны

04.02.2014, 23:15. Показов 521. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include <iostream>
#include <iomanip>
using namespace std;
 
class myClass
{
    private:
        int H, W;
        int** M;
    public:
        myClass(){} //Ïóñòîé êîíñòðóêòîð
        myClass(int h, int w) //Êîíñòðóêòîð ñ àðãóìåíòàìè
        {
            H = h;
            W = w;
        }
        ~myClass() //Äåñòðóêòîð
        {
            for(int i = 0; i < H; i++)
            {
                delete [] M[i];
            }
            delete [] M;
        }
        void setH() //Ôóíêöèÿ ââîäà êîëè÷åñòâà ñòðîê
        {
            cout << "Enter H: "; cin >> H;
        }
        void setW() //Ôóíêöèÿ ââîäà êîëè÷åñòâà ñòîëáöîâ
        {
            cout << "Enter W: "; cin >> W;
            cout << endl;
        }
        void create_fill_M() //Ôóíêöèÿ ñîçäàíèÿ ìàòðèöû
        {
            srand(time(0));
            M = new int*[H];
            for(int i = 0; i < H; i++)
                M[i] = new int[W];
            
            for(int i = 0; i < H; i++)
            {
                for(int j = 0; j < W; j++)
                {
                    M[i][j] = rand() % 100 + 1;
                }
            }
        }
        void getM() //Ôóíêöèÿ âûâîäà ìàòðèöû
        {
            for(int i = 0; i < H; i++)
            {
                for(int j = 0; j < W; j++)
                {
                    cout << setw(4) << M[i][j];
                }
                cout << endl;
            }
        }
};
 
int main()
{
    cout << "Creating matrix using constructor with arguments: \n\n";
    myClass ob1(5, 10);
    ob1.create_fill_M();
    ob1.getM();
    
    cout << endl;
    
    cout << "Creating matrix using set() functions: \n\n";
    myClass ob2;
    ob2.setH();
    ob2.setW();
    ob2.create_fill_M();
    ob2.getM();
    
    cout << endl;
    
    system("pause");
    return 0;
}
Функции create_fill_M() и getM() можно было бы объединить, но суть не в этом.
Есть ли какие-нибудь недочёты? Может что-то не к месту?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2014, 23:15
Ответы с готовыми решениями:

Бугсую. Нужен свежий взгляд
Этот кусок проги (по задумке) ищет в тексте различные скобки, да только дальше первой не идет,...

Прямоугольная матрица. Нужен взгляд специалиста!
Дана целочисленная прямоугольная матрица. Определить: 1. номер первого из столбцов, содержащих...

нужен взгляд со стороны
Добрый день, недавно сделал и внедрил на работе свой первый проект на python+django+pgsql у меня...

Нужен взгляд со стороны и критика!
Попрошу посмотреть и посоветовать ( критиковать) сайт http://luminary.org.ua/ , но прошу, не...

8
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
04.02.2014, 23:48 2
1. раз уж ты в деструкторе очищаешь память, то тогда создавай массив (выделяй память под него) в конструкторе.
2. лучше убрать возможность изменения H и W в классе, пускай только через конструктор передаются. Либо тебе придется каждый раз переопределять память.
3. Не надо внутри класса запрашивать данные, принимай данные через аргументы методов класса, а не через консоль. О входных данных должна заботиться программа, а не класс, иначе этот класс не универсален будет.
4. По моему, getM должна быть названа printM, т.к. getM должен возвращать нам указатель на массив **M
1
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
05.02.2014, 00:39  [ТС] 3
Цитата Сообщение от 646kapeh064 Посмотреть сообщение
тогда создавай массив (выделяй память под него) в конструкторе
Вот этого хотелось избежать. Получается если я создам массив, как в моём случае, через функцию
и создам ещё функцию, в которой буду очищать память, мне останется вызвать эту функцию
в функции getM() после печати или же в основной программе после вызова функции печати (getM())?
0
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
05.02.2014, 00:53 4
Цитата Сообщение от GuGo1991 Посмотреть сообщение
Вот этого хотелось избежать
Зачем?
Что может быть идеальнее, чем выделять память под массив в конструкторе, и очищать память в деструкторе?
Расскажи, для чего тебе этот класс?
0
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
05.02.2014, 01:30  [ТС] 5
646kapeh064, да так, играюсь от нечего делать.
Сам себя запутал, хотел и фиксированные размеры для матрицы и вводимые.
Думал о перегрузке конструкторов. Впрочем потом сообразил. Спасибо за помощь.
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
#include <iostream>
#include <iomanip>
using namespace std;
 
class myClass
{
    private:
        int H, W;
        int** M;
    public:
        myClass(int h = 5, int w = 5) //Êîíñòðóêòîð
        {
            H = h;
            W = w;
            srand(time(0));
            M = new int*[H];
            for(int i = 0; i < H; i++)
                M[i] = new int[W];
            
            for(int i = 0; i < H; i++)
            {
                for(int j = 0; j < W; j++)
                {
                    M[i][j] = rand() % 100 + 1;
                }
            }
        }
        ~myClass() //Äåñòðóêòîð
        {
            for(int i = 0; i < H; i++)
            {
                delete [] M[i];
            }
            delete [] M;
        }
        void getM() //Ôóíêöèÿ âûâîäà ìàòðèöû
        {
            for(int i = 0; i < H; i++)
            {
                for(int j = 0; j < W; j++)
                {
                    cout << setw(4) << M[i][j];
                }
                cout << endl;
            }
        }
};
 
int main()
{
    cout << "Creating matrix using constructor arguments: \n\n";
    myClass ob1;
    ob1.getM();    
    cout << endl;
    
    cout << "Creating matrix using manual arguments: \n\n";
    int H, W;
    cout << "Enter H: "; cin >> H;
    cout << "Enter W: "; cin >> W;
    cout << endl;
    myClass ob2(H, W);
    ob2.getM();
    
    cout << endl;
    
    system("pause");
    return 0;
}
0
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
05.02.2014, 01:49 6
Цитата Сообщение от GuGo1991 Посмотреть сообщение
Сам себя запутал, хотел и фиксированные размеры для матрицы и вводимые
Можно. Но только это надо делать более красиво.
Например, напиши 2 приватные функции:
1. создает массив размера W H
2. уничтожает массив

Затем вызывай создание массива в конструкторе а в деструкторе уничтожение массива.
И добавь функцию setSize(int H, int W) например, в которой уничтожай массив и создавай новый с этими значениями.

Нет ничего невозможного, надо лишь представить задачу и подумать как с меньшим кодом её реализовать.
1
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
05.02.2014, 02:16 7
GuGo1991, если уж есть вариант, где указатель не инициализирован, то есть, память выделена не была (Ваш конструктор по умолчанию), то стоит указателю присваивать NULL, а то не хорошо, когда мы освобождаем память, которой нет.
1
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
05.02.2014, 16:29  [ТС] 8
metaluga145, вы о моём первом варианте. Не обратил должного внимания.
Учту на будущее. Спасибо.
0
Эксперт по математике/физикеЭксперт С++
2150 / 1400 / 406
Регистрация: 16.05.2013
Сообщений: 3,575
Записей в блоге: 6
05.02.2014, 16:50 9
Добавьте конструктор копирования:
C++
1
myClass(const myClass&);
Что бы запретить коприрование объектов, либо напишите свой.
1
05.02.2014, 16:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2014, 16:50
Помогаю со студенческими работами здесь

Сборка машины, нужен взгляд со стороны!
Вообщем штука в чем, решил собрать машину собственноручно, для игр. Но вот до конца не уверен,...

ошибка (html) нужен взгляд со стороны
собственно вот такая проблема _http://apartment21.ru/view.php?id=79 при нажатии на блок &quot;Карта&quot;...

Нужен взгляд со стороны на готовую работу
Моя первая проба пера)..Если не затруднит и будет время, то гляньте, в общем и целом, проблемные...

Интересует взгляд на сайт со стороны
Взгляд уже замылился, хочется мнения со стороны. Мне кажется, что чего-то нехватает. Сайт в...


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

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