首页 > 解决方案 > 如何在友元函数中使用静态成员而不加前缀 [类名]::

问题描述

我有这个代码Player.h

class Player {
  friend void clearBoard();

private:
  static char board[4][4][4];
};

这个代码在Player.cpp

char Player::board[4][4][4] = {};

void
clearBoard() {
  for (byte i = 0; i < 4; i++)
    for (byte j = 0; j < 4; j++)
      for (byte k = 0; k < 4; k++)
        board[i][j][k] = ' ';
}

所以在编译过程中我得到一个错误

Player.cpp:37:9: error: ‘board’ was not declared in this scope
   37 |         board[i][j][k] = ' ';
      |         ^~~~~

board在其中使用了数百次,每次使用都会对可读性和我的神经产生负面影响Player.cppPlayer::

有没有办法逃离这个地狱?

我试过了

  1. using Player::board;

  2. using Player::board[][][];

  3. 用命名空间封闭我的类,然后使用该命名空间。

没有任何影响。

所有建议除了

只需重新定义clearBoard()static

将不胜感激。

标签: c++classstaticnamespacesfriend

解决方案


一般来说,少打字并不是提高可读性的方法。写作Player::board很好,因为如果你board在外面写作,Player就不清楚它来自哪里。话虽如此,如果变量名太长并且你懒得重复输入它的名字,你总是可以引入一个别名:

void
clearBoard() {
  auto& board = Player::board;
  for (byte i = 0; i < 4; i++)
    for (byte j = 0; j < 4; j++)
      for (byte k = 0; k < 4; k++)
        board[i][j][k] = ' ';
}

只要确保别名的范围很短,在这个具体的例子中我看不到好处(引入别名是更多的打字,而不是更少)。


推荐阅读