2014-03-25 50 views
0

我想在将值传递给初始化列表之前执行预处理活动。在静态初始化列表之前预处理变量

(例如:做断言检查)

下面是一些方面我的问题:假设我有,

1. class B { 
2. private: 
3.   int b_value; 
4. public: 
5.   B(int input_of_b) { 
6.    b_value = input_of_b; 
7.  } 
8. }; 

9. 
10. class A { 
11. private: 
12.  int a_value; 
13.  B b_obj 
14. public: 
15.   A(int input_value) : b_obj(input_value) { 
16.    //A constructor gets called after init list happens 
17.  } 
18. }; 

什么,如果在15行; 只是之前我叫初始化列表来初始化b_obj (b_value) - 到将input_value

我想操纵(做检查或一些预处理)将input_value的价值?

我该如何做到这一点?在Java中 - 会有像初始化块那样的东西。

我已经想到了 -

  1. 制作功能的外部A类和B,以及之前创建的对象,并以“将input_value”,预处理该值初始化。 (然而,这违反了松耦合的概念)

  2. 为类A做一个父类“A的父类”,让类A扩展它,在该类中做预处理,因为在初始化列表之前调用父构造函数?我没有尝试过,我不确定这是否是正确的方法。

+1

您可能有一个staitic成员函数int preprocess(int)并通过b_obj(预处理(输入))初始化 –

+1

听起来像它应该是'B'的责任来保持该int的正确值。那么为什么不在B的构造函数中做呢? – jrok

+0

@jrok,这可能不总是可能的,特别是如果它是库的一部分,例如 – gldraphael

回答

0

据我理解你的问题,我想你必须设法操纵在的构造函数的输入,然后从构造函数调用B的与该输入构造函数。

1

我解决了这个由

使B中的指针,在析构函数预处理值,然后使用新的初始化B对象,然后释放内存

10. class A { 
11. private: 
12.  int a_value; 
13.  B* b_obj 
14. public: 
15.   A(int input_value) { 
16.   //preprocess input_value here 
17.   b_obj = new B(input_value); 
18.   } 
19.   ~A(){ 
20.   delete b_obj; 
21.   } 
22. }; 
0

待办事项它在一个功能!

int b_validate(int); 

A::A(int input_value) 
    : b_obj(b_validate(input_value)) 
{} 

而且,我不会初始化a_value因为你应该改为移除它。