Я видел что-то вроде следующего кода, используемого для вызова функции-члена до вызова конструктора. Инициализация конструктора для _data вызывает функцию-член функции() перед конструктором.Синтаксис для вызова функции-члена перед инициализацией элемента-конструктора
class foo
{
public:
foo();
private:
int *_data;
void function();
};
foo::foo() :
_data((int *)(function(), NULL))
{
std::cout << "foo::constructor called" << std::endl;
}
void foo::function()
{
std::cout << "foo::function called" << std::endl;
}
int main()
{
foo * _foo = new foo;
delete _foo;
return 0;
}
Выход:
foo::function called
foo::constructor called
Я не очень понимаю, синтаксис _data инициализации конструктора. Если вы выполните следующие действия:
foo::foo() :
_data((int *)function())
вы получите ошибку типа броска: C2440: «типа произнесение»: не может конвертировать из «пустоты» до 'междунара *
Может кто-нибудь объяснить, что происходит Здесь?
foo::foo() :
_data((int *)(function(), NULL))
'function()' возвращает 'void'. И да, вы не можете преобразовать 'void' в тип non-'void', потому что это не имеет смысла. Этот код использует оператор запятой, чтобы сначала вызвать функцию, а затем выбросить его возвращаемое значение void, дать 'NULL' и назначить это функции' _data'. –
, пожалуйста, не делайте этого, если вам нужна сложная конструкция, пожалуйста, рассмотрите статическую заводскую функцию. Преимущества намного перевешиваются неопределенным поведением. – Mgetz