Есть ли возможность в C++ достать объект из private без наследования?
class Table{
public:
void start();
bool check_figure(int x, int y) const;
bool check_move(int x1, int y1, int x2, int y2);
bool check_move_king(int x1, int y1, int x2, int y2);
bool check_move_queen(int x1, int y1, int x2, int y2);
bool check_move_elephant(int x1, int y1, int x2, int y2);
bool check_move_horse(int x1, int y1, int x2, int y2);
bool check_move_tower(int x1, int y1, int x2, int y2);
bool check_move_pawn(int x1, int y1, int x2, int y2);
bool check_move_pre(int x1, int y1, int x2, int y2);
void move(int x1, int y1, int x2, int y2, Figures trans = Figures::none);
void reverse_motion();
Figure get(int i, int j) const { return desk[j][i];}
int get_number_move() const { return number_move;}
void display_position();
Table(){start();}
bool attack(int x, int y, FigColor col_attack) const;
One_Move past_moves(unsigned int i) const {return all_moves[all_moves.size() - i];}
vector <One_Motion> pos_moves(FigColor move_col);
vector <One_Motion> pos_moves_king(int x, int y); //улучшить
vector <One_Motion> pos_moves_queen(int x, int y); //улучшить
vector <One_Motion> pos_moves_elephant(int x, int y); //улучшить
vector <One_Motion> pos_moves_horse(int x, int y); //улучшить
vector <One_Motion> pos_moves_tower(int x, int y); //улучшить
vector <One_Motion> pos_moves_pawn(int x, int y); //улучшить
Situation desk_situation();
private:
Figure desk[n_cells][n_cells] = {};
int number_move = 0;
vector<One_Move> all_moves;
//нет перешагивания через фигуру (не нужно для коня)
bool no_step_over(int x1, int y1, int x2, int y2) const;
King_tower white_king;
King_tower black_king;
bool shah(FigColor) const;
};
достать объект из private без наследования
Из наследника Вы до private
не достучитесь, максимум до protected
. Используйте дружественные функции или классы или вложенные классы (если используете C++ 11 или выше).
Во всех остальных случаях только через октрытые геттеры или сеттеры.
Рекомендовал бы книгу Г. Саттера "Новые сложные задачи на С++" - в ней в задаче 16 рассматриваются как раз варианты достучаться до этого кода.
Первый основан на указателе - на том, что код, имеющий доступ к члену, может передать этот доступ любому другому коду, передав указатель на этот член.
Второй - с применением шаблонов. Любой шаблон члена может быть специализирован для любого типа. Специализируя его для некоторого уникального типа (в безымянном пространстве имен), вы создаете собственную функцию-член, а член класса имеет доступ ко всем частям класса...
Однако - эти методы требуют изменения объявления класса, т.е. вмешательства в заголовочный файл, а тогда уж проще просто убрать слово private
:)
P.S. Обнаружил, что уже писал на эту тему...
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть таблица wxPropertyGrid с различными полями (wxStringProperty, wxUIntProperty, wxBoolProperty и тд
Существуют ли оптимизации компилятора, которые могут привести к изменению наблюдаемого поведения программы? Если да, то какие?