如何防止实现打算在C++中不实现的方法
How to prevent implementing a method that is intended to be non-implemented in C++?
可能重复:
什么';在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(客户端构建(:它在副本构建逻辑中链接断言(来自不同的实现文件(,这样就有了运行时保护&客户端无法提供自己的实现。
您想要做的事情称为互斥。。。。做你想做的事的最好方法是。。。制作另一个实现这些函数的类>>
并在你的课堂上制作该类的对象。。。。。这样你就可以访问函数,但没有人能真正进入它们,因为它们不存在于类中……:(希望这能回答您的问题
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- std::random_device是如何实现的