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

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

17.12.2011, 21:55. Показов 825. Ответов 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru