如何防止实现打算在C++中不实现的方法

How to prevent implementing a method that is intended to be non-implemented in C++?

本文关键字:实现 C++ 方法 何防止      更新时间:2023-10-16

可能重复:
什么';在C++中禁止复制构造函数的最可靠方法是什么?

假设我想使一个类不可复制,并禁止复制构造函数和赋值运算符。我把它们保密,不执行:

class Class {
//useful stuff, then
private:
    Class( const Class& ); //not implemented anywhere
    void operator=( const Class& ); //not implemented anywhere
};

这样,如果他们中的任何一个被意外地从朋友或同一个类中调用,我就会得到一个链接时间错误。

现在,如果用户实现了它们呢?我的意思是没有实现,所以任何人都可以添加自己的:

Class::Class( const Class& )
{
    //whatever they want
}

当然,我本可以创建自己的实现并在那里添加断言,但这会将意外调用检测延迟到程序运行为止。

有没有一种方法可以防止用户实现这样的方法,并且仍然可以在编译时检测到对它们的意外调用?

在C++0x中有一个新的delete关键字,它只做这个

什么';在C++中禁止复制构造函数的最可靠方法是什么?

这里没有问题。

客户端可以随心所欲地提供这些方法的实现,但编译器仍然会抱怨,因为它们是私有的。

现在,你能防止有人入侵你的头文件,将其更改为公共文件并链接他们自己的实现吗?

是的,提供你自己的抛出异常的实现,你假设的黑客在尝试构建时会得到一个链接错误。

在正常的事件过程中,这不会减慢任何速度,因为编译器永远不会尝试调用这些方法,并且尝试的代码将被告知

无法访问私人成员在类中声明。

如果一些"聪明"的白痴尝试了,那么肯定会推迟断言,但伙计,这不是你的问题,你不能保护世界上每个白痴不朝自己的脚开枪。

+1 BTW,有趣的问题:(

正如Xeo所指出的,以上仅适用于非模板类

解决方案就像通常在实践中一样-使用特殊的不可复制基类(例如boost::noncopyable或您自己的类(。例如

class noncopyable
{
    // private
    noncopyable( const noncopyable& ); // not implemented
    noncopyable& operator=( const noncopyable& ); // not implemented
    // no friends, etc
};

然后在某个地方

class A: noncopyable
{
// Anything ...
};

显然,由于noncopyable没有朋友,它的复制构造函数和赋值运算符对每个人来说都是私有的,所以它是否实现并不重要(编译器无论如何都否认使用它们(。

这个问题有点无法回答,但可能是一种不同的方法,这在很大程度上取决于您想要实现的目标。

从表面上看,在开发库的同时,您似乎希望进行编译时检测,以加快检测速度,避免依赖运行时测试来识别问题。

如果是这样的话,是否可以通过两个构建来解决问题?

  • Build One(内部构建(:它构建库,并且不链接复制构造函数函数。

  • Build Two(客户端构建(:它在副本构建逻辑中链接断言(来自不同的实现文件(,这样就有了运行时保护&客户端无法提供自己的实现。

您想要做的事情称为互斥。。。。做你想做的事的最好方法是。。。制作另一个实现这些函数的类>>

并在你的课堂上制作该类的对象。。。。。这样你就可以访问函数,但没有人能真正进入它们,因为它们不存在于类中……:(希望这能回答您的问题