C ++奇怪的问题。数据成员超出范围

时间:2017-05-17 15:59:46

标签: c++ scope static allocation

此代码:

#include "stdafx.h"
#include <iostream>
using namespace std;
class singleTon
{
    float testVal;
public:
    singleTon()
    {
        cout << "Singleton created\n";
        testVal = 0.0;
    }
    ~singleTon()
    {
        cout << "Singleton deleted\n";
    }
    void setTest(float x)
    {
        testVal = x;
    }
    float getTest()
    {
        return testVal;
    }

};

class myClass
{
    singleTon s;

public:
    myClass()
    {
        cout << "myClass created\n";
    }
    ~myClass()
    {
        cout << "myClass deleted\n";
    }

    singleTon getSingleTon()
    {
        return s;
    }

};

int _tmain(int argc, _TCHAR* argv[])
{
    myClass m;
    m.getSingleTon().setTest(100);
    cout << "\ngetting" << m.getSingleTon().getTest();
    cout << "\nSetting:";
    m.getSingleTon().setTest(200);
    cout << "\ngetting" << m.getSingleTon().getTest();

    getchar();
    return 0;
}

在第一个setTest()之后:

m.getSingleTon().setTest(100);      

单例类的析构函数被调用。

但是,为什么?

我的理解是它仍然会在class myClass中保存单例实例。我知道,如果我使用堆分配,它可能会工作。但这种风格有什么问题?这个问题在哪里?

2 个答案:

答案 0 :(得分:1)

singleTon getSingleTon()
{
    return s;
}

此函数的返回类型既不是引用也不是指针,因此您将按值返回s ,这意味着您正在复制它并返回复印件。但是,如果要修改singleTon中存储的myClass的数据成员,您将希望通过引用返回(也可以通过指针返回,但如果不是,则通常不鼓励必要)。你的代码必须改为看起来像这样:

singleTon& getSingleTon()
{
    return s;
}

答案 1 :(得分:0)

当你调用getSinglton()时,你实际上是在myClass中获得了一个单例的副本。