当前位置:  开发笔记 > 编程语言 > 正文

使用"Uncopyable"类时,会消除GCC警告

如何解决《使用"Uncopyable"类时,会消除GCC警告》经验,为你挑选了1个好方法。

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

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

我这样使用的是:

class Entity : private Uncopyable { }

这工作正常,但是当我使用-Weffc ++编译时,我仍然收到以下警告:

class Entity has pointer data members
but does not override Entity(const Entity&)
or operator=(const Entity&)

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



1> Johannes Sch..:

C++说

因为如果未由用户声明,则为类隐式声明复制赋值运算符,则基类复制赋值运算符始终由派生类的复制赋值运算符隐藏(13.5.3).使用声明(7.3.3)从基类引入一个赋值运算符,其参数类型可以是派生类的复制赋值运算符的参数类型,不被视为复制赋值运算符的显式声明,不会抑制派生类复制赋值运算符的隐式声明; using-declaration引入的运算符由派生类中隐式声明的复制赋值运算符隐藏.

代码中的错误是您的基类声明operator=接受派生类的类型的引用.这不会阻止对基础的运算符=的隐式公开声明.因此,您的派生类基类仍然是可分配的.尝试将不可复制的类更改为非模板,这应该足够了:

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

我刚才在代码中想到的另一件事:不要使Uncopyable的析构函数变为虚拟.原因是,没有人(除了派生类本身)可以在指向Uncopyable的指针上调用delete(因为1:析构函数受到保护,2:你私有派生).因此,Uncopyable的关注点并不是使派生类的析构函数隐式虚拟化.如果派生类需要有一个虚拟析构函数,那么将虚拟析构函数放在那里,并使Uncopyables的析构函数非虚拟化.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有