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

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

Войти
Регистрация
Восстановить пароль
 
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
#1

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

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

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

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

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

Даны натуральные числа a и b которые определяют стороны прямоугольника.На сколько квадратов, стороны которого...... - C++
Есть одна задачка....помогите решить. Даны натуральные числа a и b которые определяют стороны прямоугольника.На сколько квадратов,...

Даны три стороны одного и три стороны другого треугольника. Я, чайник нужно в С++ - C++
Даны три стороны одного и три стороны другого треугольника. Эти треугольники равновеликие, т.е. имеют равные площади

Первый взгляд на функции-члены - C++
Напишите программу, которая читает несколько транзакций и подсчитывает количество транзакций для каждого ISBN.

Странное на мой взгляд объявление функции - C++
Добрый день. В исходниках усмотрел следующую вещь: void __RPC_STUB IAMCollection_get_Count_Stub( IRpcStubBuffer *This, ...

8
646kapeh064
59 / 58 / 15
Регистрация: 09.12.2013
Сообщений: 208
04.02.2014, 23:48 #2
1. раз уж ты в деструкторе очищаешь память, то тогда создавай массив (выделяй память под него) в конструкторе.
2. лучше убрать возможность изменения H и W в классе, пускай только через конструктор передаются. Либо тебе придется каждый раз переопределять память.
3. Не надо внутри класса запрашивать данные, принимай данные через аргументы методов класса, а не через консоль. О входных данных должна заботиться программа, а не класс, иначе этот класс не универсален будет.
4. По моему, getM должна быть названа printM, т.к. getM должен возвращать нам указатель на массив **M
1
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
05.02.2014, 00:39  [ТС] #3
Цитата Сообщение от 646kapeh064 Посмотреть сообщение
тогда создавай массив (выделяй память под него) в конструкторе
Вот этого хотелось избежать. Получается если я создам массив, как в моём случае, через функцию
и создам ещё функцию, в которой буду очищать память, мне останется вызвать эту функцию
в функции getM() после печати или же в основной программе после вызова функции печати (getM())?
0
646kapeh064
59 / 58 / 15
Регистрация: 09.12.2013
Сообщений: 208
05.02.2014, 00:53 #4
Цитата Сообщение от GuGo1991 Посмотреть сообщение
Вот этого хотелось избежать
Зачем?
Что может быть идеальнее, чем выделять память под массив в конструкторе, и очищать память в деструкторе?
Расскажи, для чего тебе этот класс?
0
GuGo1991
267 / 261 / 93
Регистрация: 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
646kapeh064
59 / 58 / 15
Регистрация: 09.12.2013
Сообщений: 208
05.02.2014, 01:49 #6
Цитата Сообщение от GuGo1991 Посмотреть сообщение
Сам себя запутал, хотел и фиксированные размеры для матрицы и вводимые
Можно. Но только это надо делать более красиво.
Например, напиши 2 приватные функции:
1. создает массив размера W H
2. уничтожает массив

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

Нет ничего невозможного, надо лишь представить задачу и подумать как с меньшим кодом её реализовать.
1
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
05.02.2014, 02:16 #7
GuGo1991, если уж есть вариант, где указатель не инициализирован, то есть, память выделена не была (Ваш конструктор по умолчанию), то стоит указателю присваивать NULL, а то не хорошо, когда мы освобождаем память, которой нет.
1
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
05.02.2014, 16:29  [ТС] #8
metaluga145, вы о моём первом варианте. Не обратил должного внимания.
Учту на будущее. Спасибо.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
05.02.2014, 16:50 #9
Добавьте конструктор копирования:
C++
1
myClass(const myClass&);
Что бы запретить коприрование объектов, либо напишите свой.
1
05.02.2014, 16:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2014, 16:50
Привет! Вот еще темы с ответами:

Правильность и грамотность кода (опытный взгляд на код новичка) - C++
Здравствуйте друзья. Я программист любитель, лет 10 назад неплохо разбирался в php и немного в Python+django. На питоне даже какой-то...

Изучаю С++, на какие моменты, на Ваш взгляд, необходимо обратить первоочередное внимание? - C++
Изучаю С++, на какие моменты, на Ваш взгляд, необходимо обратить первоочередное внимание?

Выбрать тему для курсовой,что самое интересное по вашему мнению, на ваш взгляд? - C++
1. Хеширование Реализовать открытое, закрытое хеширование и хеширование методом цепочек. Предусмотреть несколько различных хеш-функций. ...

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


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

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

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