Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
dimakozyr
158 / 25 / 3
Регистрация: 17.08.2013
Сообщений: 479
#1

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

14.10.2013, 14:34. Просмотров 595. Ответов 18
Метки нет (Все метки)

Есть событие, которое происходит в методе 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;
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2013, 14:34
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Передача значения переменной по ссылке (C++):

Передача значения по ссылке
Даны два файла: fun.cpp: #include <math.h> double summa(float x, float eps,...

Передача значения по ссылке
1. Объявите (в отельном заголовочном файле) и реализуйте (в другом файле)...

Передача значения и передача переменной
объясните мне разницу...и с кодами пожалуйста...думаю передача значений это...

Передача значения переменной в IplImage
Есть данные в файле с названием изображений которые нужно рассматривать. Данные...

Передача значения переменной-члена из класса в функцию
Добрый день, имеется класс: class ZernPole{ ...

Передача значения переменной из одной формы в другую
собственно, название темы говорит само за себя) пишу, мол, #include...

18
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
14.10.2013, 14:37 #2
(*o_C_DravScene_C_Events) -> getCurrentNumberOfBeavers() == beaver_00)
попробуй там скобки, приоритеты разные вроде у == и *

или (*o_C_DravScene_C_Events -> getCurrentNumberOfBeavers()) == beaver_00)
0
dimakozyr
158 / 25 / 3
Регистрация: 17.08.2013
Сообщений: 479
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)
А если так, ничего не изменяется
0
Tulosba
14.10.2013, 14:57
  #4

Не по теме:

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

0
dimakozyr
158 / 25 / 3
Регистрация: 17.08.2013
Сообщений: 479
14.10.2013, 15:15  [ТС] #5
Цитата Сообщение от Tulosba Посмотреть сообщение
поубивал бы за такие идентификаторы
спасибо за неоценимую помощь..
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
14.10.2013, 15:26 #6
Цитата Сообщение от dimakozyr Посмотреть сообщение
спасибо за неоценимую помощь..
Пожалуйста. Только вот спасибо тут иначе выражают.
Цитата Сообщение от dimakozyr Посмотреть сообщение
int* getCurrentNumberOfBeavers()
Почему возвращает указатель? Судя по названию должно возвращать число.
Цитата Сообщение от dimakozyr Посмотреть сообщение
// Здесь ошибка вылетает
Какая ошибка? Указатель o_C_DravScene_C_Events вообще инициализирован? Где код инициализации?
0
dimakozyr
158 / 25 / 3
Регистрация: 17.08.2013
Сообщений: 479
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;
0
Миниатюры
Передача значения переменной по ссылке  
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
14.10.2013, 16:38 #8
dimakozyr, инициализация, это когда объекту присваивается значение.
Где код вида:
C++
1
o_C_DravScene_C_Events = нечто;
?
0
dimakozyr
158 / 25 / 3
Регистрация: 17.08.2013
Сообщений: 479
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) {}
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
14.10.2013, 16:47 #10
Пф-ф ... констуктор C_Events есть?
0
dimakozyr
158 / 25 / 3
Регистрация: 17.08.2013
Сообщений: 479
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();
 }
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
14.10.2013, 17:51 #12
dimakozyr, и где тут инициализация поля o_C_DravScene_C_Events ?
0
dimakozyr
158 / 25 / 3
Регистрация: 17.08.2013
Сообщений: 479
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;
};
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
14.10.2013, 18:03 #14
dimakozyr, я сто раз должен что ли попросить код, где инициализация нужной переменной идет?
0
dimakozyr
158 / 25 / 3
Регистрация: 17.08.2013
Сообщений: 479
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);
Если речь не об этом, то я не понимаю, о чем тогда
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
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();
0
dimakozyr
158 / 25 / 3
Регистрация: 17.08.2013
Сообщений: 479
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);
}
0
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 Посмотреть сообщение
поубивал бы за такие идентификаторы
согласен

0
dimakozyr
158 / 25 / 3
Регистрация: 17.08.2013
Сообщений: 479
14.10.2013, 19:21  [ТС] #19
Цитата Сообщение от Jupiter Посмотреть сообщение
о_, что он обозначает?
обозначает "объект"
А как по-вашему лучше?

Добавлено через 50 секунд
и суть вопроса не в этом
0
14.10.2013, 19:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2013, 19:21
Привет! Вот еще темы с решениями:

Передача значения переменной из родительского класса в дочерний
Приветствую. Есть код: class ychebnik { protected: int A; public: ...

Передача по ссылке
В учебнике написано, что можно использовать функцию с левой стороны операции...

Передача по ссылке
Здравствуйте. 1.typedef struct { MATRIXX_LENTA<double>* MATR; //Ленточная...

Передача по ссылке
С помощью функции rand() округлить значение double и передать его по ссылке.


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru