Я делаю игру, в которой у меня есть класс Level, который занимается хранением всех объектов в векторах и их заменой.
И у меня есть другой класс, который называется Engine.h, который имеет статические функции, которые вычисляют вещи на основе векторов, которыми владеет уровень, но ничего не изменяют в них. Уровень вызывает функции Engine и выполняет операции в зависимости от того, что было возвращено.
Но так как Engine должен видеть векторы, которыми владеет Level, я вынужден передавать несколько указателей (const) векторов каждой функции Engine, чтобы он мог выполнять вычисления на основе текущего состояния векторов.
Есть ли способ заставить Engine просто иметь доступ ко всем переменным-членам Level, но не иметь возможности редактировать ни одну из них. Какой-то «постоянный друг»?
Я только что понял, что есть уровень объекта. Поэтому мне также нужно было бы иметь способ назначить Engine конкретному объекту уровня, с которым он может быть «постоянным другом».
Может быть, это сложнее. Если решения не существует, будет плохой практикой передавать множество переменных-членов в функции Engine или так будет сделано. Как насчет передачи указателя на уровень, который является константой (это также сделает все переменные-члены уровней константными?)
Допустим, у вас есть класс Foo
который имеет переменную-член x
Вы хотите получить доступ. Ты можешь сделать const
функции, которые обращаются к переменным-членам по значению. Так как они const
они не могут изменять какие-либо переменные-члены.
class Foo
{
public:
Foo() : x{0} {} // constructor
int getX() const { return x; } // this is a "getter"void setX(int value) { x = value; } // this is a "setter"private:
int x;
};
Тогда вы можете иметь другой класс Bar
, Может быть, в какой-то функции ему нужен доступ к x
переменная Foo
Вы можете использовать геттер.
class Bar
{
void doStuff (Foo a)
{
int answer = a.getX();
std::cout << answer << std::endl;
}
};
Теперь мы можем взглянуть на небольшую демонстрацию. Мы делаем пример Foo
и экземпляр Bar
, Тогда мы можем установить x
значение для Foo
и получить к нему доступ из Bar
«s doStuff
функция.
int main()
{
Bar myBar;
Foo myFoo;
myFoo.setX(5);
myBar.doStuff(myFoo); // will output 5
return 0;
}
Вы можете делать такие вещи, если это поможет:
class Level
{
private:
std::vector<float> stuff;
public:
// give outsiders const access
const std::vector<float>& const_stuff = stuff; // c++11 else use ctor
const std::vector<float>& get_stuff() const { return stuff; } // more idiomatic
};