草庐IT

c++ - 在 C++ 中明确禁止堆分配

我有许多类我想明确禁止堆分配。这个周末我突然想到,我可以将operatornew声明为私有(private)(并且未实现)......果然,当你尝试新建类时,这会导致编译错误......我的问题是:还有更多吗?我是否遗漏了什么,或者这是做我想做的事的好方法?#includeclassNotOnTheHeap{public:NotOnTheHeap():foo(0){}private:void*operatornew(size_t);voidoperatordelete(void*);void*operatornew[](size_t);voidoperatordelete[](void

c++ - 为什么标准禁止部分特化的友元声明?

C++标准禁止部分特化的友元声明。(§14.5.3/8):Frienddeclarationsshallnotdeclarepartialspecializations.[Example:templateclassA{};classX{templatefriendclassA;//error};--endexample]其他问题,例如thisone,已收到援引此禁令的答复,但我想知道理由。我没有看到它,也无法用我最喜欢的搜索引擎找到它。我但是可以发现它可以追溯到C++98标准,所以大概基本原理很明确。谁能给我解释一下? 最佳答案 我

c++ - 为什么标准禁止部分特化的友元声明?

C++标准禁止部分特化的友元声明。(§14.5.3/8):Frienddeclarationsshallnotdeclarepartialspecializations.[Example:templateclassA{};classX{templatefriendclassA;//error};--endexample]其他问题,例如thisone,已收到援引此禁令的答复,但我想知道理由。我没有看到它,也无法用我最喜欢的搜索引擎找到它。我但是可以发现它可以追溯到C++98标准,所以大概基本原理很明确。谁能给我解释一下? 最佳答案 我

c++ - 为什么禁止一次打开多个命名空间?

可以做到usingnamespacefoo::bar;(即使用内部命名空间而不首先使用外部命名空间),为什么标准禁止这样做?namespacefoo::bar{//opennestednamespacebarinfooandextendit...}我不是在寻找解决方法,只是想说明为什么不允许这样做。 最佳答案 我不确定“禁止”是正确的词-也许这只是一个疏忽。这是一个相当小的好东西,并不是什么大不了的事。您还可以认为,当您编写foo::bar时,命名空间foo尚未创建,因此允许该语法使其看起来像foo已经被创建,但它不是。您还可以更进

c++ - 为什么禁止一次打开多个命名空间?

可以做到usingnamespacefoo::bar;(即使用内部命名空间而不首先使用外部命名空间),为什么标准禁止这样做?namespacefoo::bar{//opennestednamespacebarinfooandextendit...}我不是在寻找解决方法,只是想说明为什么不允许这样做。 最佳答案 我不确定“禁止”是正确的词-也许这只是一个疏忽。这是一个相当小的好东西,并不是什么大不了的事。您还可以认为,当您编写foo::bar时,命名空间foo尚未创建,因此允许该语法使其看起来像foo已经被创建,但它不是。您还可以更进

c++ - 是否可以禁止引用对象

我想做与制作类的实例相反的操作noncopyable,即确保特定类的实例可以仅作为拷贝传递,并且不作为引用。如果任何函数试图通过引用接收它,我希望它给出编译错误(理想情况下)或运行时错误。我不认为将operator&设为私有(private)会这样做,是否有合法的方式这样做。 最佳答案 那是不可能的。任何命名变量都可以绑定(bind)到适当类型的引用变量。这就是语言的工作原理。特别是,你永远不可能有一个复制构造函数有你的限制,所以你实际上不能按值传递对象! 关于c++-是否可以禁止引用对

c++ - 是否可以禁止引用对象

我想做与制作类的实例相反的操作noncopyable,即确保特定类的实例可以仅作为拷贝传递,并且不作为引用。如果任何函数试图通过引用接收它,我希望它给出编译错误(理想情况下)或运行时错误。我不认为将operator&设为私有(private)会这样做,是否有合法的方式这样做。 最佳答案 那是不可能的。任何命名变量都可以绑定(bind)到适当类型的引用变量。这就是语言的工作原理。特别是,你永远不可能有一个复制构造函数有你的限制,所以你实际上不能按值传递对象! 关于c++-是否可以禁止引用对

c++ - 有没有办法禁止我的类的子类化?

假设我有一个名为“Base”的类,以及一个名为“Derived”的类,它是Base的子类,可以访问Base的protected方法和成员。我现在要做的就是让它没有其他类可以继承Derived。在Java中,我可以通过将Derived类声明为“final”来实现这一点。有什么C++技巧可以给我同样的效果吗?(理想情况下,我想让除Derived之外的任何类都不能继承Base。我不能只将所有代码放入同一个类或使用friend关键字,因为Base和Derived都是模板化,Base的模板参数比Derived少....) 最佳答案 从C++1

c++ - 有没有办法禁止我的类的子类化?

假设我有一个名为“Base”的类,以及一个名为“Derived”的类,它是Base的子类,可以访问Base的protected方法和成员。我现在要做的就是让它没有其他类可以继承Derived。在Java中,我可以通过将Derived类声明为“final”来实现这一点。有什么C++技巧可以给我同样的效果吗?(理想情况下,我想让除Derived之外的任何类都不能继承Base。我不能只将所有代码放入同一个类或使用friend关键字,因为Base和Derived都是模板化,Base的模板参数比Derived少....) 最佳答案 从C++1

C++ 禁止可变大小数组

我正在使用其他人编写的一些现有代码,但我无法编译它(这里的C经验有限,但我正在努力学习!)。utilities.cc#include"utilities.h"FILE*open_file(char*filename,constchar*extension,constchar*access){charstring[MAX_STR_LEN];FILE*strm=NULL;if(filename[0]=='\0'){printf("\nINPUTFILENAME(%s)>",access);fgets(string,MAX_STR_LEN,stdin);sscanf(string,"%s",