【问题标题】:C++ friend functionC++ 友元函数
【发布时间】:2018-08-11 16:44:54
【问题描述】:

我正在为我的大学制作国际象棋游戏,我必须使用至少一个朋友功能。

这是我的 BoardField 类头:

#include "Game.h"

class BoardField {
private:
    ChessPiece m_piece;
    SDL_Rect m_field;

public:
    BoardField();

    friend void Game::init_board_fields();
};

部分游戏类头:

class Game {
private:
    //members
    ...

    //methods
    ...
public:
    void init_board_fields();
    ...
};

以及方法:

void Game::init_board_fields()
{
    int field_width = m_window_props.w / 8;
    int field_height = m_window_props.h / 8;
    int field_index = 0;

    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            BoardField field;
            // here I get the error that member m_field is inaccessible
            field.m_field = { j * field_width, i * field_height, field_width, field_width };
            m_board_fields[field_index++] = field;
        }
    }
}

所以我收到此错误(在最后一个代码块中查找注释)。 我对朋友了解不够吗?此关键字是否允许访问私有成员/方法或执行其他操作?

【问题讨论】:

  • 这个访问应该没问题。
  • 尝试构建,你的 IDE 很可能会给你那个不是实际错误的错误。
  • 我试图编译,我也得到了这个错误:“游戏”不是 boardfield.h 中的类或命名空间名称
  • tutorialspoint.com/cplusplus/cpp_friend_functions.htm 你可以结交整个类或某个函数(免费的 C 风格函数),但不能结交方法。

标签: c++ oop friend


【解决方案1】:

我只想说朋友方法 c++ 不是任何类的一部分。话虽如此,您的朋友方法不是 BoardField 类的一部分,但它正在尝试访问其私有成员(这是错误的)。

游戏类头文件必须在 Game.cpp 中实现,而不是在 BoardField 类中。 您收到错误是因为您试图通过 Game 类中声明的方法访问 BoardField 类的私有成员。这里我忽略了朋友的概念。

在您的案例中使用朋友概念的正确方法是让您的 BoardField 类成为游戏类的朋友。这样,Game 类将可以访问 BoardField 类中的所有内容。这最终将在您尝试做的事情中发挥作用。

您只需在 Game 类中声明 :friend BoardField。

class Game {
private:
    //members
    ...

    //methods
    friend BoardField;
    ...
public:
    void init_board_fields();
    ...
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多