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

Передача значения переменной по ссылке - C++

Восстановить пароль Регистрация
 
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
14.10.2013, 14:34     Передача значения переменной по ссылке #1
Есть событие, которое происходит в методе someMethod, при выполнении которого программа вылетает.

Методу someMethod нужно получить переменную currentNumberOfBeaver с помощью ссылок и указателей.
Если передавать по аргументу через функцию-геттер, то не вылетает. Что я не так с указателями сделал?


//C_Events.cpp
C++
1
2
3
4
5
6
#include "C_Events.h"
void someMethod() {
    // Здесь ошибка вылетает
    if(*o_C_DravScene_C_Events -> getCurrentNumberOfBeavers() == beaver_00)
        makeBeaverRed(30, 180, p, pli);
}
//C_Events.h
C++
1
2
3
4
5
#include "C_DravScene.h"
class C_Events {
    C_DrawScene* o_C_DravScene_C_Events;
    enum numberOfBeaver {beaver_00};
};
//C_DravScene.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct C_DravScene {
        inline void generateCurrentNumberOfBeaver() {
        srand((unsigned int)time(0));
        currentNumberOfBeaver = rand() % (15);
    }
 
    inline int* getCurrentNumberOfBeavers()
        { return &currentNumberOfBeaver; }
 
  private:
 
      int currentNumberOfBeaver;
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
14.10.2013, 14:37     Передача значения переменной по ссылке #2
(*o_C_DravScene_C_Events) -> getCurrentNumberOfBeavers() == beaver_00)
попробуй там скобки, приоритеты разные вроде у == и *

или (*o_C_DravScene_C_Events -> getCurrentNumberOfBeavers()) == beaver_00)
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
14.10.2013, 14:42  [ТС]     Передача значения переменной по ссылке #3
Цитата Сообщение от dzrkot Посмотреть сообщение
(*o_C_DravScene_C_Events) -> getCurrentNumberOfBeavers() == beaver_00)
Если так сделать, то пишет, что выражение должно иметь тип указателя

C++
1
((*o_C_DravScene_C_Events -> getCurrentNumberOfBeavers()) == beaver_00)
А если так, ничего не изменяется
Tulosba
14.10.2013, 14:57
  #4

Не по теме:

поубивал бы за такие идентификаторы

dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
14.10.2013, 15:15  [ТС]     Передача значения переменной по ссылке #5
Цитата Сообщение от Tulosba Посмотреть сообщение
поубивал бы за такие идентификаторы
спасибо за неоценимую помощь..
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.10.2013, 15:26     Передача значения переменной по ссылке #6
Цитата Сообщение от dimakozyr Посмотреть сообщение
спасибо за неоценимую помощь..
Пожалуйста. Только вот спасибо тут иначе выражают.
Цитата Сообщение от dimakozyr Посмотреть сообщение
int* getCurrentNumberOfBeavers()
Почему возвращает указатель? Судя по названию должно возвращать число.
Цитата Сообщение от dimakozyr Посмотреть сообщение
// Здесь ошибка вылетает
Какая ошибка? Указатель o_C_DravScene_C_Events вообще инициализирован? Где код инициализации?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
14.10.2013, 16:26  [ТС]     Передача значения переменной по ссылке #7
Цитата Сообщение от Tulosba Посмотреть сообщение
Почему возвращает указатель? Судя по названию должно возвращать число.
Так и есть. Убрал указатель. Я просто в указателях не сильно шарю

Цитата Сообщение от Tulosba Посмотреть сообщение
Какая ошибка?
Нарушение прав доступа при чтении по адресу

Цитата Сообщение от Tulosba Посмотреть сообщение
Указатель o_C_DravScene_C_Events вообще инициализирован? Где код инициализации?
Вот, в классе C_Events:
C++
1
C_DrawScene* o_C_DravScene_C_Events;
Миниатюры
Передача значения переменной по ссылке  
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.10.2013, 16:38     Передача значения переменной по ссылке #8
dimakozyr, инициализация, это когда объекту присваивается значение.
Где код вида:
C++
1
o_C_DravScene_C_Events = нечто;
?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
14.10.2013, 16:42  [ТС]     Передача значения переменной по ссылке #9
Цитата Сообщение от Tulosba Посмотреть сообщение
инициализация, это когда объекту присваивается значение.
Где код вида:
Код C++
1
o_C_DravScene_C_Events = нечто;
Я понимаю. Под инициализацией экземпляра класса подразумевается конструктор?
Если да, то вот:
C++
1
2
C_DrawScene() : currentNumberOfBeaver(0) { generateCurrentNumberOfBeaver(); }
C_DrawScene(int crrntnmbrbvr) : currentNumberOfBeaver(crrntnmbrbvr) {}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.10.2013, 16:47     Передача значения переменной по ссылке #10
Пф-ф ... констуктор C_Events есть?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
14.10.2013, 17:21  [ТС]     Передача значения переменной по ссылке #11
Цитата Сообщение от Tulosba Посмотреть сообщение
Пф-ф ... констуктор C_Events есть?
Да, вот они:
C++
1
2
3
4
5
6
7
8
9
10
11
12
C_Events() : x(0), y(0), w(0), h(0),
                   currentCounter(0),
                   totalCounter(0),
                   timeToStartScreenContinue(false),
                   timeToStartScreenGameOver(false) {}
 
 C_Events(int xParam, int yParam, int wParam, int hParam)
         : x(xParam), y(yParam), w(wParam), h(hParam) {
                 o_rect_C_Events.x = x;     o_rect_C_Events.y = y;
                 o_rect_C_Events.w = w;     o_rect_C_Events.h = h;
                 loadTotalCounter();
 }
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.10.2013, 17:51     Передача значения переменной по ссылке #12
dimakozyr, и где тут инициализация поля o_C_DravScene_C_Events ?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
14.10.2013, 17:57  [ТС]     Передача значения переменной по ссылке #13
Цитата Сообщение от Tulosba Посмотреть сообщение
dimakozyr, и где тут инициализация поля o_C_DravScene_C_Events ?
Я все экземпляры инициализирую конструктором по умолчанию:

C++
1
2
3
C_DravScene {
    C_DrawScene() : currentNumberOfBeaver(0) { generateCurrentNumberOfBeaver(); }
}
Например, как здесь:
C++
1
2
3
4
5
6
7
8
class C_Events {
  public:
      C_InitSurfaces o_C_InitSurfaces_C_Events;
      C_LoadImages     o_C_LoadImages_C_Events;   
      C_DrawScene*      o_C_DravScene_C_Events;
      C_Blitting         o_C_Blitting_C_Events;
      C_Music                o_C_Muic_C_Events;
};
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.10.2013, 18:03     Передача значения переменной по ссылке #14
dimakozyr, я сто раз должен что ли попросить код, где инициализация нужной переменной идет?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
14.10.2013, 18:09  [ТС]     Передача значения переменной по ссылке #15
Цитата Сообщение от Tulosba Посмотреть сообщение
dimakozyr, я сто раз должен что ли попросить код, где инициализация нужной переменной идет?
o_C_DravScene_C_Events - это экземпляр класса C_DravScene. Данный экземпляр создается в строке:
C++
1
C_DrawScene* o_C_DravScene_C_Events;
Экземпляр создается без параметров, т.е. для него вызывается конструктор по умолчанию:
C++
1
C_DrawScene() : currentNumberOfBeaver(0) { generateCurrentNumberOfBeaver(); }
в котором переменной currentNumberOfBeaver присваивается ноль. Вот и вся инициализация.

Можно еще вызвать конструктор с параметрами:
C++
1
C_DrawScene* o_C_DravScene_C_Events(0);
Если речь не об этом, то я не понимаю, о чем тогда
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.10.2013, 18:16     Передача значения переменной по ссылке #16
C++
1
C_DrawScene* o_C_DravScene_C_Events;
это указатель на C_DrawScene. Тут нет экземпляра класса C_DrawScene.
Чтобы создавался объект и вызывался конструктор по умолчанию должно быть так:
C++
1
C_DrawScene o_C_DravScene_C_Events;
или так:
C++
1
C_DrawScene* o_C_DravScene_C_Events = new C_DrawScene();
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
14.10.2013, 18:35  [ТС]     Передача значения переменной по ссылке #17
Цитата Сообщение от Tulosba Посмотреть сообщение
C_DrawScene* o_C_DravScene_C_Events = new C_DrawScene();
Все, теперь понял, но начал сомневаться, что мне указатели нужны.

Мне просто нужно передать по ссылке currentNumberOfBeaver в C_Events::someMethod(),
как это можно просто сделать?

// C_DravScene.h
C++
1
2
3
4
5
6
7
8
9
10
11
struct C_DrawScene {    
    inline void generateCurrentNumberOfBeaver() {
        srand((unsigned int)time(0));
        currentNumberOfBeaver = rand() % (15);
    }
 
    inline int getCurrentNumberOfBeavers()
        { return currentNumberOfBeaver; }
  private:
      int currentNumberOfBeaver;
};
// C_Events.h
C++
1
2
3
4
5
#include "C_DravScene.h"
class C_Events {
    C_DrawScene o_C_DravScene_C_Events;
    enum numberOfBeaver {beaver_00};
};
// C_Events.cpp
C++
1
2
3
4
5
6
#include "C_Events.h"
void someMethod() {
    // Здесь ошибка вылетает
    if(o_C_DravScene_C_Events.getCurrentNumberOfBeavers() == beaver_00)
        makeBeaverRed(30, 180, p, pli);
}
Jupiter
14.10.2013, 18:59
  #18

Не по теме:

Цитата Сообщение от dimakozyr Посмотреть сообщение
C_InitSurfaces o_C_InitSurfaces_C_Events;
* * * C_LoadImages * * o_C_LoadImages_C_Events; *
* * * C_DrawScene** * * o_C_DravScene_C_Events;
* * * C_Blitting * * * * o_C_Blitting_C_Events;
* * * C_Music * * * * * * * *o_C_Muic_C_Events
ужасы нашего городка какие-то. к чему этот префикс о_, что он обозначает? идентификаторов которые имеют явно выраженную букву "о" или 0 цифру "0" стоит избегать.
Цитата Сообщение от Tulosba Посмотреть сообщение
поубивал бы за такие идентификаторы
согласен

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2013, 19:21     Передача значения переменной по ссылке
Еще ссылки по теме:

C++ Передача значения по ссылке
C++ Передача по ссылке
Передача по ссылке C++

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

Или воспользуйтесь поиском по форуму:
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
14.10.2013, 19:21  [ТС]     Передача значения переменной по ссылке #19
Цитата Сообщение от Jupiter Посмотреть сообщение
о_, что он обозначает?
обозначает "объект"
А как по-вашему лучше?

Добавлено через 50 секунд
и суть вопроса не в этом
Yandex
Объявления
14.10.2013, 19:21     Передача значения переменной по ссылке
Ответ Создать тему
Опции темы

Текущее время: 20:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru