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

Вектор объектов класса - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Возвращение двух значений через ссылку и return http://www.cyberforum.ru/cpp-beginners/thread1775620.html
При выполнении программы функция возвращает количество и сумму чисел, находящихся между первым и последним отрицательными элементами. Через return я возвращал количество, а через ссылку - сумму. Количество возвращается правильно, а сумма - рядом цифр. В чем допущена ошибка? #include<iostream> #include<cstdlib> using namespace std; int n, a, i1=0, n1, i2=0, n2, rez, i, kol=0, ccilka=0,...
C++ Разъясните код работы с xinput1_4.dll Здравствуйте! Я по моему уже задавал этот вопрос давно, но не кто не ответил, объясните, что обозначает этот код: // здесь есть что то лишнее? И как это работает #define X_INPUT_GET_STATE(name) DWORD WINAPI name(DWORD dwUserIndex, XINPUT_STATE *pState) typedef X_INPUT_GET_STATE(x_input_get_state); X_INPUT_GET_STATE(XInputGetStateStub) { return(ERROR_DEVICE_NOT_CONNECTED); } static... http://www.cyberforum.ru/cpp-beginners/thread1775589.html
Удаление начального узла C++
Всем привет,помогите пожалуйста, нужно написать функцию,которая удаляет начальный узел двухсвязного линейного списка
C++ Вывести элементы матрицы, равные сумме индексов
Нужно создать двумерный массив A и вывести его элементы, равные i+j; Заранее благодарю за помощь. :)
C++ Почему равно нулю? http://www.cyberforum.ru/cpp-beginners/thread1775506.html
Здравствуйте!У меня проблемы с кодом!Оно всегда равняется нулю,а должно к числу.Помогите пожалуйста;) #include <iostream> #include <vector> using namespace std; class SISO { virtual float simulate(float u) = 0; };
C++ Из числа float получить два int-a: целую и дробную части Всем привет. Как можно из числа float получить два inta. приведу пример: есть 1,45 и 2,397. из первого нужно получить 1 и 45, из второго 2 и 397... подробнее

Показать сообщение отдельно
Operok
128 / 126 / 33
Регистрация: 15.02.2015
Сообщений: 393
Завершенные тесты: 2
05.07.2016, 13:18     Вектор объектов класса
Цитата Сообщение от HEYDEPZHUMblU Посмотреть сообщение
В моей задаче мне нужно изменить количество животных при покупке, но мой код на поле количества не влияет.
Т.е. вы вызываете функцию Zoo::buy, покупаете, ещё раз вызываете, выбираете второй пункт меню, а изменение нет? Передавайте вектор по ссылке:
C++
1
2
void Zoo::buy(vector <Zoo> & Animal)
{ ... }
Для вашего случая, если вы отказались от динамических данных, просто не объявляйте деструктор.
Теперь о "правиле пяти"...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class SomeClass
{
public:
    SomeClass() 
    { 
        init_somedata(data); //инициализация ресурса с помощью некоторой функции (создание объекта в куче через "new" тоже по сути инициализация)
    }  
    ~SomeClass() 
    {
        free_somedata(data); //освободили ресурс (или "delete" для объекта полученного через "new")
    }
 
private:
    SomeDataType* data;  //некоторый ресурс, доступный через указатель
}
Вроде бы всё должно быть хорошо, но если написать нечто такое:
C++
1
2
3
4
5
6
7
8
int main()
{
    SomeClass some_object1;  //ничего страшного
    ...
    {  //некоторая область видимости
        SomeClass some_object2 = some_object1;  //вызов дефолтного конструктора копирования, который просто скопирует указатель
    }
}
После выхода из "некоторой области видимости" второй объект уничтожится (вызовется деструктор) освободив ресурс, на который продолжает ссылаться первый объект.
Для того чтобы избежать таких неприятностей нужно определить копирующие конструктор и оператор присваивания:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class SomeClass
{
   ...
    SomeClass(const SomeClass& other)
    {
        copy_somedata(data, other.data);  //копирование ресурса
    }
    SomeClass& operator=(const SomeClass& other)
    {
        if (&other != this) {   //не нужно присваивать объект самому себе
            free_somedata(data);
            copy_somedata(data, other.data);
        }
        return *this;
    }
    ...
}
На этом можно и остановиться, но с выходом стандарта C++11 мы можем избегать чрезмерного копирование, которое влечёт использование "тяжелых" функций, как наша copy_somedata, если будем использовать семантику перемещения, там где это нужно, разумеется (это очень обширная тема, излагать её тут нет смысла и времени):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class SomeClass
{
    ...
    SomeClass(SomeClass&& other) noexcept  //перемещающий конструктор не должен бросать исключения
    {
        data = other.data;   
        other.data = NULL;   //other - временный объект и использоваться дальше не будет
    }
    SomeClass& operator=(SomeClass&& other) noexcept
    {
        swap(data, other.data);  //стандартная функция, далее временный объект other будет уничтожен
        return *this;
    }
    ~SomeClass()
    {
        if (data)  //добавим проверку на NULL, так как такая ситуация теперь возможна
            free_somedata(data);
    }
    ...
}
 
Текущее время: 10:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru