C++ ООП.Доступ к private

98
28 октября 2021, 07:20

Есть ли возможность в 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;
};
Answer 1

достать объект из private без наследования

Из наследника Вы до private не достучитесь, максимум до protected. Используйте дружественные функции или классы или вложенные классы (если используете C++ 11 или выше).

Во всех остальных случаях только через октрытые геттеры или сеттеры.

Answer 2

Рекомендовал бы книгу Г. Саттера "Новые сложные задачи на С++" - в ней в задаче 16 рассматриваются как раз варианты достучаться до этого кода.

Первый основан на указателе - на том, что код, имеющий доступ к члену, может передать этот доступ любому другому коду, передав указатель на этот член.

Второй - с применением шаблонов. Любой шаблон члена может быть специализирован для любого типа. Специализируя его для некоторого уникального типа (в безымянном пространстве имен), вы создаете собственную функцию-член, а член класса имеет доступ ко всем частям класса...

Однако - эти методы требуют изменения объявления класса, т.е. вмешательства в заголовочный файл, а тогда уж проще просто убрать слово private :)

P.S. Обнаружил, что уже писал на эту тему...

READ ALSO
Потоки ввода/вывода С++

Потоки ввода/вывода С++

Есть вопрос по потокам ввода/вывода

84
GetFocus на wxStringProperty

GetFocus на wxStringProperty

Есть таблица wxPropertyGrid с различными полями (wxStringProperty, wxUIntProperty, wxBoolProperty и тд

191
Кроссплатформенность оптимизаций

Кроссплатформенность оптимизаций

Существуют ли оптимизации компилятора, которые могут привести к изменению наблюдаемого поведения программы? Если да, то какие?

80
Непересекающиеся множества. Ошибка error C2064

Непересекающиеся множества. Ошибка error C2064

Пожалуйста, помогите мне, что я делаю не так?

104