【问题标题】:How can I use static members in friend functions without prefixing [class name]::如何在友元函数中使用静态成员而不加前缀 [类名]::
【发布时间】:2020-10-12 17:50:12
【问题描述】:

我在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] = ' ';
      |         ^~~~~

我在Player.cpp 中使用board 几乎还有一百次,每次使用Player:: 都会对可读性和我的神经产生负面影响。

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

我试过了

  1. using Player::board;

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

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

没有任何影响。

所有建议,除了

只需将clearBoard() 重新定义为static

将不胜感激。

【问题讨论】:

  • “使用Player:: 会对可读性产生负面影响”——不,不会。去做吧。
  • 我在 if 语句中有 board[i][j][k] 。他们中的很多......
  • 如果变量名太长,您可以随时使用auto&amp; x = some_super_long_variable_name;。虽然,输入更少!=可读性。您需要限定名称的来源是有原因的
  • 您可以将inline 用于static 成员和c++17,而不是显式初始化。课外

标签: c++ class static namespaces friend


【解决方案1】:

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

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] = ' ';
}

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 2016-12-21
  • 2018-12-31
  • 1970-01-01
相关资源
最近更新 更多