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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Динамический список http://www.cyberforum.ru/cpp-beginners/thread164561.html
Помогите решить задачу. Вчера обращалась, знаю, стыдно. ._. В общем, другая задачка и большая просьба написать её на этом уровне: ссылка удалена Слёзно прошу! Т_Т Само задание, в общем-то... Сформировать динамический список (стек или очередь), считая, что длина списка (количество элементов) задана. В составе программы описать функцию, которая находит наибольший элемент списка и его...
C++ Создать два объекта и определить минимальное значение из чисел Описать класс , который хранит значение двух чисел и функцию для определения минимального из них , числа должны быть с ограниченым доступом , функция с открытым доступом . Создать два объекта и определить минимальное значение из чисел . http://www.cyberforum.ru/cpp-beginners/thread164452.html
Классы: круг, квадрат, прямоугольник C++
Описать классы соответсвующие кругу , квадрату и прямоугольнику . В каждом из классов реализовать функцию подсчета площади фигуры , сравнить площади фигур какая из них больше .
Сеть Dos <-> Windows C++
Есть ли у кого исходники или какая-нить информация по организации сети межу станциями на ОС DOS и Windows? Спасибо.
C++ Описать функцию, которая удаляет все минимальные элементы из списка http://www.cyberforum.ru/cpp-beginners/thread164390.html
Помогите пожалуйста. Я студент второго курса. (Не программист ни разу >.<") Мне нужна помощь в написании программы. Завтра уже нужно принести результат. Вот сама задача: Сформировать динамический список (стек или очередь), считая, что длина списка (количество элементов) задана. В составе программы описать функцию, которая удаляет все минимальные элементы из списка. Очень прошу помощи!
C++ Создание службы в Visual Studio Доброго всем времени суток! Есть проблема: Нужно портировать на С++ код написанного на Си-Шарпе приложения-службы. Именно так, чтобы программа была в натив-кодах. Попробовал писать в С++ Билдере - почему-то глюк на глюке (версия 2009). Как можно создать проект службы в Visual Studio именно в натив-коде, а не в CLR? Заранее спасибо! Добавлено через 2 минуты Сорри, вопрос исчерпан. Ответ... подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
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;
}
 
Текущее время: 10:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru