Я хочу выполнить предварительную обработку, прежде чем передать значение в список инициализации.
(например: сделать проверку утверждений)
Вот некоторый контекст моего вопроса: предположим, у меня есть,
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 ??
Как мне этого добиться?
В Java — что-то вроде блока инициализации.
Я уже думал о —
Создание функции, внешней по отношению к классам A и B, и непосредственно перед созданием объекта A и инициализация его значением «input_value», предварительно обработайте это значение. (Однако это нарушает концепцию слабой связи)
Сделав родительский класс «родительским классом А» для класса А, сделайте так, чтобы класс А расширил его, выполните предварительную обработку в этом классе, так как родительский конструктор вызывается перед списком инициализации? Я не пробовал это, и я не уверен, что это правильный подход.
Я решил это
создание B указателя, предварительная обработка значения, а затем инициализация объекта B с использованием new, а затем освобождение памяти в деструкторе
то есть
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. };
Насколько я понимаю ваш вопрос, я думаю, что вы должны попытаться манипулировать вводом в конструкторе a, а затем вызывать конструктор b этого конструктора с этим вводом.
Сделай это в функции!
int b_validate(int);
A::A(int input_value)
: b_obj(b_validate(input_value))
{}
Кроме того, я не инициализирую a_value
потому что вы должны удалить его вместо этого.