структура — Как заставить класс C ++ обращаться ко ВСЕМ закрытым членам другого класса постоянным способом (только чтение, а не запись)

Я делаю игру, в которой у меня есть класс Level, который занимается хранением всех объектов в векторах и их заменой.

И у меня есть другой класс, который называется Engine.h, который имеет статические функции, которые вычисляют вещи на основе векторов, которыми владеет уровень, но ничего не изменяют в них. Уровень вызывает функции Engine и выполняет операции в зависимости от того, что было возвращено.

Но так как Engine должен видеть векторы, которыми владеет Level, я вынужден передавать несколько указателей (const) векторов каждой функции Engine, чтобы он мог выполнять вычисления на основе текущего состояния векторов.

Есть ли способ заставить Engine просто иметь доступ ко всем переменным-членам Level, но не иметь возможности редактировать ни одну из них. Какой-то «постоянный друг»?

Я только что понял, что есть уровень объекта. Поэтому мне также нужно было бы иметь способ назначить Engine конкретному объекту уровня, с которым он может быть «постоянным другом».
Может быть, это сложнее. Если решения не существует, будет плохой практикой передавать множество переменных-членов в функции Engine или так будет сделано. Как насчет передачи указателя на уровень, который является константой (это также сделает все переменные-члены уровней константными?)

0

Решение

Допустим, у вас есть класс 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;
}
1

Другие решения

Вы можете делать такие вещи, если это поможет:

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
};
0

По вопросам рекламы [email protected]