gpt4 book ai didi

c++ - 单例模式的类成员初始化失败

转载 作者:行者123 更新时间:2023-11-28 02:58:50 24 4
gpt4 key购买 nike

我正在使用单例模式编写一个类。代码如下:

啊啊

#include <iostream>

class A {
public:
static A get_instance();
static A* get_instance_ptr();
void init(int i);
void print_data(void);
private:
static A* instance_ptr;
int data;
};

A* A::instance_ptr = NULL;

A* A::get_instance_ptr()
{
if (NULL == instance_ptr) {
instance_ptr = new A();
}
return instance_ptr;
}

A A::get_instance()
{
return *get_instance_ptr();
}

void A::init(int i)
{
data = i;
std::cout << "In A::init, data = " << data << std::endl;
}

void A::print_data(void)
{
std::cout << "In A::print_data, data = " << data << std::endl;
}

ma​​in.cpp:

#include <iostream>
#include "A.h"

int main(int argc, _TCHAR* argv[])
{
A::get_instance().init(42);
A::get_instance().print_data();
return 0;
}

原理是在A::init()中初始化data,在A::print_data中打印。但是输出是:

In A::init, data = 42
In A::print_data, data = 0

看来 data 初始化没有工作。但是,如果我将 main 中的初始化更改为:

A::get_instance_ptr()->init(42);

输出符合预期:

In A::init, data = 42
In A::print_data, data = 42

那么问题来了,为什么第一次尝试成员初始化就失败了?

最佳答案

因为 get_instance 的返回类型是 A 而不是正确的 A& 因此每次都会返回您的“单例”的拷贝你叫它。 init 调用对原始对象的拷贝进行操作,然后 print_data 对不同的拷贝进行操作。总而言之,main 已经成功创建了三个单例拷贝。

可以复制的单例并不是真正的单例。您应该采取最低限度的措施来防止复制(声明私有(private) ctors 和赋值运算符而不是定义它们)。

关于c++ - 单例模式的类成员初始化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21388891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com