线程本地显示所有对象实例的相同数据

时间:2016-03-07 10:18:05

标签: c++ qt c++11

我只是使用thread_local在其较低的模块中共享我的对象。但它始终采用最后一个实例对象数据。

Test1.h

thread_local void* currentpointer=nullptr;

Test1::Test1(int val)
{
    currentpointer = this;
    obj = new Test2;
    temp = val;
}
void Test1::display()
{
    qDebug()<<Q_FUNC_INFO<<temp;
}

Test1.cpp

class Test2
{
public:
    Test2();
    void display();
};

Test2.h

Test2::Test2()
{
}
void Test2::display()
{
    ((Test1*)currentpointer)->display();
}

测试2.cpp

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   Test1 obj1(100);
   Test1 obj2(200);
   Test1 obj3(300);

   obj1.obj->display();
   obj2.obj->display();
   obj3.obj->display();

    return a.exec();
}

的main.cpp

{{1}}

响应:

void Test1 :: display()300

void Test1 :: display()300

void Test1 :: display()300

我在这里做错了什么可以帮助我摆脱这个问题。

1 个答案:

答案 0 :(得分:1)

按此顺序创建对象

Test1 obj1(100);
Test1 obj2(200);
Test1 obj3(300);

Test1::obj获取每个Test1对象的Test2对象ptr。

void Test2::display()
{
    ((Test1*)currentpointer)->display();
}

返回currentpointer静态变量

每次调用currentpointer ctor时,

Time1都会被设置

Test1::Test1(int val)
{
    currentpointer = this;
    obj = new Test2;
    temp = val;
}

所以基本上你的代码工作得很完美,静态变量逻辑就是

obj1.obj->display();
obj2.obj->display();
obj3.obj->display();

返回相同的对象,从而显示相同的字符串