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

Инкапсуляция. Классы и их компоненты. Объекты - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ транслит http://www.cyberforum.ru/cpp-beginners/thread164582.html
ни как не пойму , как сделать чтобы к руской букве приделать другой синвол.ну типа там A=$ ну чтоб получилось когда я ввожу синволы на руском он мне переделал их на те которые я ему збил (типа...
C++ Класс - строка Народ, здравствуйте, есть такая задача. Определить класс - строку. в класс включить два конструктора: создание строки символов и конструктор-копия. Определить функции - члены: вывод на экран... http://www.cyberforum.ru/cpp-beginners/thread164563.html
Динамический список C++
Помогите решить задачу. Вчера обращалась, знаю, стыдно. ._. В общем, другая задачка и большая просьба написать её на этом уровне: ссылка удалена Слёзно прошу! Т_Т Само задание, в общем-то... ...
Замена элементов списка C++
Помогите пожалуйста написать программу. В составе программы описать функцию, которая заменяет в списке все вхождения элемента E1, значение которого введено с клавиатуры, на элемент E2, значение...
C++ Структур комплексных чисел http://www.cyberforum.ru/cpp-beginners/thread164524.html
Задание: Организовать структуру комплексных чисел и для неё реализовать операции: +, -, *, /, и нахождение сопряженного числа. Результат вывести на экран. Для демонстрации работы функции сделать меню...
C++ Шифрование чисел Программа должна шифровать число следующим образом: заменять каждую цифру остатком от деления (цифра+7)/10. Затем написать программу дешифровки для получения исходных чисел. (Задачка взята собственно... подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
10.09.2010, 14:33
Цитата Сообщение от Novichok92 Посмотреть сообщение
А тот код вообще не правильный?
Сейчас пройдемся по недостаткам приведенного выше кода:
  1. Для управления инициализацией и очисткой объектов существуют специальные методы - конструкторы и деструкторы (у Вас их роль играют методы SetArr и Delete соответственно). Для чего нужна инициализация объектов в конструкторе? Для того, чтобы предотвратить доступ к неинициализированным данным-членам класса. Даже если нужно, чтобы заполнение массива происходило не в момент создания объекта класса, то все равно хорошо было бы объявить конструктор по умолчанию для инициализации данных класса нулевыми значениями. Зачем нужен деструктор? Затем, что он автоматически вызывается, когда уничтожается объект. Т.е., если зачисткой данных у Вас занимается не деструктор, а другой метод, то необходимо явно вызывать его перед уничтожением объекта. Забыли это сделать - получили утечку памяти
  2. Внутри методов класса не принято организовывать взаимодействие с пользователем (т.е. обращение к потокам ввода-вывода). Вот навскидку несколько причин для этого. Во-первых, каждый раз, когда Вы собираетесь менять формат ввода-вывода данных Вашего класса, Вам необходимо менять реализацию класса. Во-вторых, представьте, что Вам нужно использовать Ваш класс в программе с графическим интерфейсом, которая никак не взаимодействует с консолью. В этом случае Ваш класс будет абсолютно бесполезен и Вам опять придется его переписывать.
    Так что оптимальная стратегия - это передача конструктору класса уже имеющихся данных, на основе которых он и построит объект класса. Альтернатива - перегрузка операторов ввода-вывода, но этим увлекаться тоже нельзя, т.к. случаи, когда они действительно повышают удобство/гибкость прогаммы, встречаются достаточно редко (яркий пример - для большинства контейнеров STL они не определены).
Цитата Сообщение от Novichok92 Посмотреть сообщение
Но что там я вообще не понимаю и для чего. Этот код соответствует заданию?
Он соответсвует только части задания, а именно:
Цитата Сообщение от Novichok92 Посмотреть сообщение
Для каждого созданного объекта выполнить по очереди функции ввода размера массива, выделения памяти, ввода данных в массив, вывода данных на экран, вывода одного из элементов массива и освобождения памяти.
и
Цитата Сообщение от Novichok92 Посмотреть сообщение
В функции main() создать автоматический объект разработанного класса, динамический объект и (формально) массив объектов (из 3-4 элементов).
А еще этот код содержит грубую ошибку: для задания размера массива используется неинициализированная переменная, значение которой не определено.

Создания указателя на (существующий) объект и объекта с областью видимости и контекстом внутреннего блока - нет.

Вот так может выглядеть дополнительное задание с моим классом:
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
#include <iostream>
#include <ctime>
#include <cstdlib>
#include "arr.hpp"
 
void randomArray(int* iarr, size_t sz)
{
    for(size_t i = 0; i < sz; ++i)
        iarr[i] = rand() % sz + sz;
}
 
int main()
{
    srand(static_cast<size_t>(time(NULL)));
    const size_t n = 8;
    int initArr[n];
    
    // Автоматический объект
    randomArray(initArr, n);
    iarray autoArr(n, initArr);
    std::cout << autoArr << std::endl;
    
    // Указатель на существующий объект
    iarray* pautoArr = &autoArr;
    // Можно повторно его инициализировать
    randomArray(initArr, n);
    pautoArr->setArray(initArr);
    std::cout << (*pautoArr) << std::endl;
    
    // Динамический объект
    randomArray(initArr, n);
    iarray* pdynArr = new iarray(n, initArr);
    std::cout << (*pdynArr) << std::endl;
    // Деструктор динамического объекта нужно вызывать явно:
    delete pdynArr;
    
    // Массив объектов
    iarray arr3[3];
    for(size_t i = 0; i < 3; ++i)
    {
        randomArray(initArr, n);
        arr3[i].resize(n); // Нужно написать метод resize
        arr3[i].setArray(initArr);
        std::cout << "#" << i + 1 << std::endl << arr[i] << std::endl;
    }
        
    // Объект внутри блока
    {
        randomArray(initArr, n);
        iarray inside(n, initArr);
        std::cout << inside << std::endl;
    }
    // std::cout << inside << std::endl; -- ошибка! - здесь объект уже не существует
    return EXIT_SUCCESS;
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru