Недавно я вернулся на C++ с языков сценариев, таких как PHP и LSL, и некоторые из его правил определения области меня смущают.Как понять правила C++ для определения переменных?
Скажет, у меня есть Viewer.h вроде так:
class Viewer {
public:
Viewer();
~Viewer();
void ping();
void setBgColour(int r, int g, int b, int a);
float bg_r;
float bg_g;
float bg_b;
float bg_a;
};
и Viewer.C вроде так:.
#include "Globals.h"
#include "Viewer.h"
Viewer::Viewer() {}
Viewer::~Viewer() {}
void Viewer::ping() {
cout << "Viewer::ping() " << endl;
}
void Viewer::setBgColour(int r, int g, int b, int a) {
bg_r = r/255.0;
bg_g = g/255.0;
bg_b = b/255.0;
bg_a = a/255.0;
}
Я объявленный экземпляр моего просмотра класса в Global { h | C} как «extern», чтобы иметь возможность доступа к экземпляру глобального зрителя из других файлов.
Теперь рассмотрим это, когда я называю глобальные методы экземпляра для просмотра, например, в UI.C:
viewer->ping();
viewer->setBgColour(123, 45, 56, 255);
viewer-> пинг() работает нормально, но viewer-> setBgColour() дает мне при попытке доступа к переменным экземпляра bg_r, bg_g, bg_b и bg_a.
Насколько я понимаю, я не имею доступа к правильному экземпляру зрителя.
viewer-> ping() не имеет значения, поскольку он будет просто эхо-текст в cout независимо от экземпляра, из которого он действительно вызван. Но setBgColour() нуждается в доступе к правильным местам памяти, поэтому он не работает, когда он не может их найти.
Это смущает меня, поскольку я был/находится под впечатлением, что объявление моего экземпляра зрителя как «extern» будет «просто работать». Дурак я. Я пробовал объявлять переменные как «статические», но это меня просто смутило.
Вы действительно выделили 'Viewer', или у вас есть неинициализированный указатель? Если все, что у вас есть, это «Viewer * viewer», то у вас есть последнее. –
Вы должны показать строку кода, в которой вы создаете зрителя! Я подозреваю, что @JonathanPotter прав. –
Является ли значение 'viewer' равным' nullptr'? Если 'viewer' является глобальным, тогда вы должны проверить, что он был создан до его использования. –