防止复制构造函数实例化 C++11 类"deleting"
Prevent instantiation of C++11 class by "deleting" copy constructor
我想在 C++11 中创建一个"静态类",即一个只有静态方法且无法实例化或继承的类。 提出了以下解决方案:
class Foo final {
public:
static void methodA(...);
static int methodB(...);
Foo(const Foo&) = delete;
};
这样,编译器既不会创建默认值,也不会创建复制构造函数。Visual Studio的IntelliSense也证实了这一点,因为它在键入Foo(
时不提供任何构造函数自动完成。
我想知道这个解决方案是否比使默认构造函数私有的"通用"方法更可取。有什么优点/缺点吗?
将 ctor 设为私有的区别在于,这用于不允许您使用= delete
的旧C++标准。执行此操作的旧形式不那么"干净",因为它依赖于链接器而不是编译器来提供错误消息。如果你的 ctor 是私有的并且没有定义,但你仍然调用它(例如,从类函数中(,链接器将负责中止生成过程并出现错误(因为 ctor 只是声明的,而不是定义的。= delete
形式更简洁,因为编译器现在可以直接发出错误。
但是,您在这里追求的内容与命名空间非常相似。所以我建议你这样做:
namespace Foo {
void methodA(...);
int methodB(...);
}
这不会更改用于调用函数的完全限定形式。像以前一样,您用Foo::methodA()
调用methodA()
,因此这应该充当直接替换。
如果需要,您还可以使用using
语句删除Foo::
。例如:
using Foo::methodA;
methodA(); // Valid call.
或者只是using Foo;
将所有标识符从Foo
引入当前范围,而不必在其中任何一个前面加上Foo::
.(通常的警告适用于此处关于命名空间污染的问题。
不能使用静态类函数执行此操作。
看起来你用错了工具来完成这项工作,namespace
(根据@jamesdlin的评论(会做你想做的事:
namespace Foo {
void methodA(...);
int methodB(...);
};
相关文章:
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- C++中的VLA,扩展名为std=C++11
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 如何使用lock_guard在c++11中实现scoped_lock功能
- C++11 中不同类型的对象的 std::array 的替代方案
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- STLPort using C++11
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- 防止复制构造函数实例化 C++11 类"deleting"