[问题] C++同类别创建不同物件资源共享问题(解决)

楼主: imalex   2014-09-24 00:10:18
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++ 6
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
N/A
问题(Question):
我现在需要提供一Library给多执行绪程式,Library的实作有包含其它类别的物件
预期使用API创建不同的物件应该为资源独立
但实际去跑才发现同类别的二个物件,其底层使用的其它物件是同一份
例如:
// Library的header
class Lib_Impl; // Library的实作类别
class Lib
{
public:
Lib(void) {};
void set_id(int obj_id);
....
private:
Lib_Impl *m_impl;
};
// Library的cpp档
Lib::Lib()
{
m_impl = new Lib_Impl();
}
void Lib::set_id(int obj_id)
{
m_impl->obj_id = obj_id;
}
假如Lib_Impl有个成员变量为obj_id,Library提供一API去设定它
如果使用者create 2个Lib物件并设定不同的id
例如:
// 使用此Library的cpp档
void main()
{
// Create Library object
Lib *obj_1 = new Lib();
Lib *obj_2 = new Lib();
obj_1->set_id(1);
obj_2->set_id(2);
}
此时我预期二个物件底下Lib_Impl的id应该是不一样的
但obj_1底下的id都会被obj_2所影响
请问是哪里出错了呢?
此Library的设计方式如果在多执行绪的环境创建多个物件会是安全的吗?
谢谢
喂入的资料(Input):
预期的正确结果(Expected Output):
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版)
补充说明(Supplement):
谢谢johnpage网友, 我回去检查Lib_Impl类别, 因为它是用工厂方法创建的
而我把二个可能创建的类别宣告成全域物件才会导致这个问题
作者: LPH66 (-6.2598534e+18f)   2014-09-24 00:41:00
只看这样似乎没看到什么问题, 有没有实际的程式?
作者: bluesoul (忙死你老爸)   2014-09-24 01:23:00
有static member吗?
作者: scwg ( )   2014-09-24 03:35:00
header file 和 cpp 里重复定义 construcor?如果 Library.cpp 有 include Library.h compile 应该会出错但是如果 .cpp 没 include .h, 只重写一次 class bodymain.cpp 在 compile 的时候可能把 .h 里的空 constructorinline, 那 m_impl 就没有被 new 到 obj_1/2 的 m_impl 都指到 0, 在某些系统下还是可以读写 obj_id 而且会是同一份
作者: johnpage (johnpage)   2014-09-24 08:09:00
问题应该在 class Lib_Impl

Links booklink

Contact Us: admin [ a t ] ucptt.com