c++ 错误:'sf::NonCopyable& sf::NonCopyable::operator=(const sf::NonCopyable&)'在此上下文中是私有的

raogr8fs  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(134)

关于问题

我的问题很受欢迎,我找到了解决方案。然而,我不明白为什么当我在构造函数中分配一个窗口时会弹出一个错误,但是当我在初始化列表中分配一个窗口时,一切都正常。

好代码

class Player : public sf::CircleShape
{
private:
   int X;
   int Y;
   sf::Image image;
   sf::Texture texture;
   sf::Sprite sprite;
   sf::RectangleShape rectangle;
   sf::RenderWindow& window;
public:
   Player(sf::RenderWindow& win, sf::Image image) : window(win){}
};

错误码

class Player : public sf::CircleShape
{
private:
   int X;
   int Y;
   sf::Image image;
   sf::Texture texture;
   sf::Sprite sprite;
   sf::RectangleShape rectangle;
   sf::RenderWindow& window;
public:
   Player(sf::RenderWindow& win, sf::Image image) 
   {
     window = win;
   }
};

友情链接

下面是我找到的答案的链接。也许它会帮助你解决我的问题。我在那里找到了我的问题的答案,但我仍然不明白为什么我不能在构造函数中分配一个窗口。
use of deleted function ‘sf::RenderWindow& sf::RenderWindow::operator=(const sf::RenderWindow&)’
谢谢你的帮助:)

2w2cym1i

2w2cym1i1#

我将使用简化版本。

int main() {
    int a = 0, b = 123;

    int& x = a;
    x = b;       // assigns 123 to a, a is now 123
}

坏了

int main() {
    int a = 0, b = 123;

    int& x;      // <- error here
    x = b;       // would assign 123 to the variable x should be referencing
}

为什么“坏”的版本不好?

  • 引用 * 必须 * 初始化。一旦初始化,它们就不能(合法地)引用另一个对象。

为什么?

  • 因为语言规则。如果你想让某个对象被设置为不引用另一个对象,你可以使用指针。用nullptr初始化一个指针,并使它在以后指向一个对象。然而,如果函数没有其他方法知道它不是nullptr,那么 * 可以 * 是nullptr的东西也需要被函数检查。你不需要检查一个引用是否引用了任何东西。是的。如果你的坏版本是法律的的,这个承诺就不会成立了。

还可以考虑一下,如果x = b;使x引用b,而不是它实际上做了什么,这对引用意味着什么:将b保存的值赋给x引用的对象。

相关问题