初始化构造函数内的成员变量? (这应该是非常基本的...)

时间:2011-07-09 12:21:02

标签: c++

编辑:我需要重构这个问题,它有太多无关的组件要清楚我的问题(关于C ++)是什么。但任何能够理解我要问的人都应该回答。

我有一个代表线程的类。我正在使用的线程库TinyThread ++通过创建一个thread对象来启动一个线程,但是它没有复制构造函数。这有道理..复制线程的意义究竟是什么?

以前我一直用这种方式初始化我的线程对象E_thread

class E_thread {
    E_threadRoutine m_routine;
    E_thread *m_parent;
    thread m_thread;
public:
    E_thread(void *(void*),void*,E_thread*);
};
E_thread::E_thread(void *func(void*), void *arg, E_thread* parent): 
         m_parent(parent), m_routine(func,arg), 
         m_thread(thread_function_common, &m_routine) 
         {}

以这种方式初始化thread ctor,我将E_thread的{​​{1}}成员的指针作为其参数发送给线程。 m_routine的目的是跟踪线程特定的功能以传递给线程本身。

但是现在我想更改一下我想要更仔细地分配m_routine的地方。现在m_routine是一个指针,我需要用

设置它
m_routine

m_routine = new E_threadRoutineTypeX(func,arg,etc); ctor中。但这意味着我不能再像以前那样初始化E_thread。我试过把

thread
在正文中

但这会复制我不想做的线程对象。这样做有一些语法......

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:使用函数初始化m_routine,这将返回一个新的E_threadRoutine,如此 -

m_routine(createThreadRoutine(func, arg))

并让createThreadRoutine以您想要的方式返回一个新的E_threadRoutine。然后,您可以使用(thread_function_common,m_routine)初始化m_thread。 createThreadRoutine的使用不是强制性的,但如果需要的话,它可以让你做的不仅仅是new

为此,m_routine必须出现在类中的m_thread之前,否则m_thread将在m_routine设置之前初始化。请参阅Constructor initialization-list evaluation order

答案 1 :(得分:1)

class E_thread {
    E_threadRoutine* m_routine;
    E_thread *m_parent;
    thread m_thread;
public:
    E_thread(void *(void*),void*,E_thread*);
};
E_thread::E_thread(void *func(void*), void *arg, E_thread* parent) : 
    m_routine(new E_threadRoutineTypeX(func,arg,etc)), 
    m_parent(parent),
    m_thread(thread_function_common, m_routine) 
{}

我也改变了你的成员初始化顺序,它应该总是按照成员在类中出现的顺序出现,以避免错误。