Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143

Классы. Не возвращает найденный объект.

17.12.2011, 21:55. Показов 857. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
class Worker
{
public:
 
    Worker() {} // finder
    Worker(int workerId) : itsWorkerId(workerId) { itsMoneysCount = 0;}
    ~Worker() {}
 
    int GetWorkerId() { return itsWorkerId; }
    void AddMoneys(int moneysCount) { itsMoneysCount +=moneysCount; }
    int GetMoneys() { return itsMoneysCount; }
 
    void Accept() { workers.push_back(this); }
 
    Worker* GetWorker(int workerId);
private:
    std::vector <Worker*> workers;
    int itsWorkerId;
    int itsMoneysCount;
};
 
Worker* Worker::GetWorker(int workerId)
{
    for(std::vector <Worker*>::iterator it = workers.begin(); it<workers.end(); ++it)
    {
        if((*it)->GetWorkerId() == workerId)
            return (*it);
    }
 
    return NULL;
}
 
void main()
{
    Worker w(1); // объявляем ID рабочего
    w.AddMoneys(5000);
        w.Accept(); // записываем в вектор 
 
 
    if(Worker* finder = finder->GetWorker(1))
        std::cout << finder->GetMoneys() << std::endl; // программа крешится
 
    std::cin.get();
}
Проблема в том, что когда я хочу управлять найденным объектом - программа крешится.
В чём ошибка?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2011, 21:55
Ответы с готовыми решениями:

Функция не возвращает объект
Всем счастья. Собственно углубляюсь в PHP и для себя решаю задачи вида разных алгоритмов. Щас с бинарным деревом работаю и реализовал...

Функция возвращает объект
Доброго времени суток! Как сделать, чтобы функция возвращала объект, ну или указатель на объект. Использую так: ...

Запрос возвращает объект, не ресурс
Здравствуйте! Пытаюсь переписать пример из одной из книжек для расширения mysqli из старого mysql. Запрос для старого mysql выглядит...

5
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.12.2011, 22:03
Цитата Сообщение от res Посмотреть сообщение
C++
1
2
3
4
5
for(std::vector <Worker*>::iterator it = workers.begin(); it<workers.end(); ++it)
 {
 if((*it)->GetWorkerId() == workerId)
 return (*it);
 }
Вы создали вектор указателей на ваш класс. Пустой вектор, в нем ни фига нет - и тут же обращаетесь к его элементам, коих не существует. Это ошибка.

Цитата Сообщение от res Посмотреть сообщение
C++
1
2
if(Worker* finder = finder->GetWorker(1))
 std::cout << finder->GetMoneys() << std::endl; // программа крешится
Точно такая же ерунда. Создали указатель finder, не присвоили ему адреса существующего объекта класса и тут же обращаетесь по указателю. Куда обращаетесь? Это ошибка.
1
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
17.12.2011, 22:25  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Вы создали вектор указателей на ваш класс. Пустой вектор, в нем ни фига нет - и тут же обращаетесь к его элементам, коих не существует. Это ошибка.
Вектор не пуст
C++
1
2
3
4
        
        Worker w(1); // объявляем ID рабочего
        w.AddMoneys(5000);
        w.Accept(); // записываем в вектор
проблема с этим уже решена, но вот появилась другая.
Сейчас отпишусь после тестов

Добавлено через 11 минут
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
// преопределение 
class Worker;
 
// база данных рабочих
struct WorkersDB
{
    static vector <Worker*> cache;
};
 
// управление рабочими
class Worker
{
public:
 
    Worker() {} // finder
    Worker(int workerId) : itsWorkerId(workerId) { itsMoneysCount = 0;}
    ~Worker() {}
 
    int GetWorkerId() { return itsWorkerId; }
    void AddMoneys(int moneysCount) { itsMoneysCount +=moneysCount; }
    int GetMoneys() { return itsMoneysCount; }
 
    void Accept() { WorkersDB::cache.push_back(this); }
 
    static Worker* GetWorker(int workerId);
private:
    int itsWorkerId;
    int itsMoneysCount;
};
 
 
 
Worker* Worker::GetWorker(int workerId)
{
    // пытаюсь найти по ID из статического вектора
    for(vector <Worker*>::iterator it = WorkersDB::cache.begin(); it<WorkersDB::cache.end(); ++it)
    {
        if((*it)->GetWorkerId() == workerId)
            return (*it);
    }
 
    return NULL;
}
 
void main()
{
    Worker w(1); // объявляем ID рабочего
    w.AddMoneys(5000); // добавляем деньги
    w.Accept(); // записываем его в вектор
 
    if(Worker* finder = finder->GetWorker(1)) // находим рабочего
        cout << finder->GetMoneys() << endl;
 
    cin.get();
}
Компиляцирует без ошибок, но ошибка компоновки:
HTML5
1
error LNK2001: неразрешенный внешний символ ""public: static class std::vector<class Worker *,class std::allocator<class Worker *> > WorkersDB::cache" (?cache@WorkersDB@@2V?$vector@PAVWorker@@V?$allocator@PAVWorker@@@std@@@std@@A)"
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.12.2011, 22:42
Цитата Сообщение от res Посмотреть сообщение
WorkersDB::cache.push_back(this);
Вот что вы хотите этой строчкой сделать? Для начала нужен объект структуры WorkersDB, чтобы обращаться к ее членам. Где у вас этот объект создается?

Добавлено через 1 минуту
Вот так, к примеру:
C++
1
2
WorkersDB base;
base.cache.push_back(this);
0
63 / 58 / 14
Регистрация: 14.12.2011
Сообщений: 193
17.12.2011, 22:43
Если не ошибаюсь статик в структурах использовать нельзя.
1
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
18.12.2011, 12:19  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Вот что вы хотите этой строчкой сделать? Для начала нужен объект структуры WorkersDB, чтобы обращаться к ее членам. Где у вас этот объект создается?
Вектор объявлен как статический.

Добавлено через 1 минуту
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Если не ошибаюсь статик в структурах использовать нельзя.
Почему нельзя? Можно.

Добавлено через 2 часа 41 минуту
Понял свою ошибку, когда почитал про статические поля.
Нужно инициализировать
vector<Worker*> WorkersDB::cache;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.12.2011, 12:19
Помогаю со студенческими работами здесь

Soap wsdl возвращает объект, а не xml
Здравствуйте. Такая проблема: в 1С хранятся данные, программист 1С настроил wsdl службу чтобы можно было с сайта получить данные из 1С. ...

Retrofit возвращает объект с пустыми полями
Когда я посылаю Retrofit запрос, то он связывается с сервером, но метод body() возвращает объект Info (НЕ null) с пустыми полями. Как...

ДокументВыборка.Ссылка.ПолучитьОбъект() возвращает ссылку, а не объект
Битый час уже бьюсь. Если в вкратце то выглядит все так. Ссылка рабочая. Цикл и условие работают. Только метод ПолучитьОбъект выдает...

Возвращает один объект, остальные не видит/пропускает
см. комментарии, там расписал, в чем конкретно проблема, входные данные class Item: #класс предмета, здесь вроде ошибок нет. ...

Функция или свойство DataGridWiev, которое возвращает выбранный объект
И снова здравствуйте! Подскажите функцию или свойство dataGridWiev которое возвращает выбранный объект как comboBox.SelectedItem()


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru