0

我试图让我的头脑围绕 5 规则。

我有一个 class Renderable,它定义了一个自定义析构函数,所以它似乎是 5 规则的一个很好的候选者。这个类在它的构造函数中创建了一些资源,所以我的第一个想法是我应该防止复制:

class Renderable {

public:

    Renderable(const Sprite&) {
        // Allocate resources
    }

    ~Renderable() {
        // Free resources
    }

    // Prevent copying
    Renderable(const Renderable& other) = delete;

}

我有另一个类,它在其构造函数的初始化列表中Unit创建一个:Renderable

class Unit {

public:

    Unit(const Sprite& sprite) :
            renderable(Renderable(sprite)) {}

private:

    Renderable renderable;

}

我希望这会调用常规Renderable构造函数,但我得到了错误:

Renderable::Renderable(const Renderable &)':试图引用已删除的函数

为什么这试图调用复制构造函数?

我什至尝试在复制构造函数中添加调试行,但没有打印任何内容:

Renderable(const Renderable& other) : sprite(other.sprite) {
    std::cout << "copy constructor";
}
4

3 回答 3

4

首先,Renderable(sprite)创建一个Renderable. 然后你尝试renderable用那个来构建Renderable。从概念上讲,除了复制构造函数之外还能使用什么?

你为什么要创建一个Renderable来初始化renderable?由于您没有复制构造函数,因此不需要该步骤并且不会工作。您已经明确表示您不希望在概念上使用复制构造函数的代码工作。

于 2019-08-22T21:33:04.350 回答
3

除了其他人所说的之外,我认为您的意思是:

Unit::Unit(const Sprite& sprite) :
    renderable(sprite) {}

这调用转换构造函数直接Renderable(const Sprite&)初始化renderable,不涉及复制。

现场演示

于 2019-08-22T22:14:05.717 回答
1

为什么这试图调用复制构造函数?

因为

  renderable(Renderable(sprite)) {}

这构造了一个临时Renderable对象,然后用它来构造renderable类成员。那将是一个

我什至尝试在复制构造函数中添加调试行,但没有打印任何内容:

这是因为这是允许编译器进行复制省略的情况之一。即使编译器优化了临时+复制构造,构造函数必须仍然存在。关于类的某些东西会导致默认的复制构造函数被删除。这可能有几个原因,但您没有提供有关您的班级的足够信息,以确定该原因可能是什么。

于 2019-08-22T21:36:54.180 回答