我有几个我不想被复制的类,其中一些类具有指针数据成员。为了使这些类不可复制,我私下继承了以下类模板:

template <class T>
class Uncopyable
{
  protected:
    Uncopyable() {}
    virtual ~Uncopyable() {}
  private:
    Uncopyable(const Uncopyable &);
    T & operator=(const T&);
};

我这样使用:
class Entity : private Uncopyable<Entity> { }

这很好,但是当我使用-Weffc++编译时,仍然收到以下警告:
class Entity has pointer data members
but does not override Entity(const Entity&)
or operator=(const Entity&)

为什么仍然会给我这个警告?

最佳答案

C++说



代码中的错误是您的基类声明operator=接受派生类类型的引用。那将不会阻止对操作符隐式地公开声明基数。因此,您的派生类您的基类仍然可以分配。尝试将不可复制的类更改为非模板,这应足以:

class Uncopyable
{
  protected:
    Uncopyable() {}
    virtual ~Uncopyable() {}
  private:
    Uncopyable(const Uncopyable &);
    Uncopyable & operator=(const Uncopyable&);
};

我刚刚在该代码中想到了另一件事:不要将Uncopyable虚拟函数作为析构函数。原因是,除了派生类本身之外,没有人可以对指向Uncopyable的指针调用delete(因为1:析构函数受到保护,2:您私下派生)。因此,将派生类的析构函数隐式虚拟化是Uncopyable的问题。如果派生类需要具有虚拟析构函数,则将virtual放入其中,并将Uncopyables的析构函数保留为非虚拟。

关于c++ - 使用 “Uncopyable”类时静默GCC警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/394854/

10-11 23:07