C++-C++中如何禁止创建类的临时对象

发布于 2016-10-11 10:13:58 字数 31 浏览 1213 评论 6

如题,在C++中,如何实现禁止创建类的临时对象?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

想挽留 2017-09-26 14:47:07

私有函数吧,boost很多都是这样的

清晨说ぺ晚安 2017-07-01 14:51:32

构造函数声明为explicit可以防止编译器创建临时对象

晚风撩人 2017-04-19 08:24:08

将构造函数设置为私有。

晚风撩人 2017-03-08 21:59:08

不仅要将构造函数设为私有,还需要将拷贝构造函数声明为私有。如下代码所示:

//: C10:Singleton.cpp 
// Static member of same type, ensures that 
// only one object of this type exists. 
// Also referred to as the "singleton" pattern. 
#include <iostream> 
using namespace std; 
class Egg 
{ 
    static Egg e; 
    int i; 
    Egg(int ii) : i(ii) {} 
    Egg(const Egg&); // Prevent copy-construction 
public: 
    static Egg* instance() { return &e; } 
    int val() const { return i; } 
}; 

Egg Egg::e(47); 

int main() 
{ 
    //! Egg x(1); // Error -- can't create an Egg 
    // You can access the single instance: 
    cout << Egg::instance()->val() << endl; 
} ///:~ 

若不声明拷贝函数为私有,那么就可以通过如下语句创建新的对象:

Egg e = *Egg::instance();
Egg e2(*Egg::instance());

这两条语句都使用了拷贝构造函数,所以为了禁止这种可能,拷贝构造函数声明为私有的。
参考阅读:《C++编程思想第一卷第2版》10.3.3小节

浮生未歇 2017-02-08 09:20:46

可以这样实现:
1. 将构造函数定义为私有的;
2. 在类中定义一个static的成员函数CreateObject,调用这个私有的构造函数创建对象;
3. 这样的话,每当要创建这个类的对象时都要显示的调用这个CreateObject函数,无法隐式的调用构造函数生成临时对象。

这种机制有点类似于设计模式中的单例模式,但是可以不受限于单例

甜柠檬 2016-10-24 00:23:00

 // 拷贝构造函数,赋值运算符重载宏定义
#define COPY_CONSTRUCTOR_ASSIGNMENT(type)
type(const type&);
void operator=(const type)

class OperatorProcessor
{
public:
static OperatorProcessor* getInstance(); // 单一化实例,创建静态对象
~OperatorProcessor();
void OperatorAnd();
void OperatorOr();
void setOperator(STRING);
INT8 getOperatorChar();

private:
OperatorProcessor(); // 禁止使用构造函数
COPY_CONSTRUCTOR_ASSIGNMENT(OperatorProcessor); // 禁止使用拷贝和赋值函数

private:
STRING m_operator;
};

OperatorProcessor* OperatorProcessor::getInstance()
{
static OperatorProcessor obj;
return &obj;
}

int main()
{
// 使用时这样使用,维持一个静态对象
OperatorProcessor::getInstance()->getOperatorChar();
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文