为什么我不能让这个成员函数成为另一个 class 的好友?

Why can't I make this member function friend of another class?

#ifndef BUTTONS_H
#define BUTTONS_H

class Window;

class Buttons
{
  friend int main();
  friend void Window::setCloseButtonCaption(string);

public:
    Buttons();
    Buttons(string, Window&);
    ~Buttons();

    void setCaption(string);
    string getCaption();

private:
    string caption;
    const Window * parentWindow;
};

class Window
{

public:
    Window();
    Window(int i, int l,int t, int w, int h, Buttons& B): id(i),left(l), top(t), width(w), height(h), closeButton(B){}
   ~Window(void);

    void setleft(int);
    void settop(int);
    void setw(int);
    void seth(int);

    int getid() const;
    int getleft() const;
    int getwidth() const;
    int getheight() const;
    int getnW() const;

    void Print() const;
    void setCloseButtonCaption(string);

private:
    const int id;
    int left;
    int top;
    int width;
    int height;
    static int numberOfWindows;
    const Buttons closeButton;
};

#endif

代码 运行 很好,直到我将函数 Window::setCloseButtonCaption(string) 设为按钮 class 的友元。我尝试在 class 按钮之前定义 class Window 但它没有改变。 它给了我错误:

-使用未定义的类型'Window'

-参见 'Window'

的声明

顺便说一句,我是初学者,提供详细的解释会很有帮助。非常感谢

对于 class 成员(与自由函数不同)成员声明应该在 friend 声明之前可见。

我通常建议在 Buttons class 之前定义你的 Window class 以便能够与它的成员成为朋友.但是,您的 Window class 需要定义 Buttons。所以,你有可能的解决方案:

  • Window
  • 中通过指针或引用切换到使用Buttons
  • 您可以使 Buttons 成为 Window 的内部结构。类似的东西(删节代码)

...

struct Window {
  void setCloseButtonCaption(const std::string& caption);
  struct Buttons {
      friend void Window::setCloseButtonCaption(string);
  };
  Window(int i, int l,int t, int w, int h, Buttons& B): id(i),left(l), top(t), width(w), height(h), closeButton(B){}
};