2014-11-11 2 views
1

Я хотел бы сделать что-то вроде следующего:Делегирование Конструкторы с In-члены класса инициализации

class DelegatingCTorPlusInClass 
{ 
public: 
    DelegatingCTorPlusInClass() 
    : 
    DelegatingCTorPlusInClass(m_a, m_b) // m_a and m_b are "random" 
    { 
    }; 

    DelegatingCTorPlusInClass(int a) 
    : 
    DelegatingCTorPlusInClass(a, m_b) // m_b is "random" 
    { 
    }; 

    DelegatingCTorPlusInClass(const std::string &b) 
    : 
    DelegatingCTorPlusInClass(m_a, b) // m_a is "random" 
    { 
    }; 

    DelegatingCTorPlusInClass(int a, const std::string &b) 
    : 
    m_a(a), 
    m_b(b) 
    { 
    // DO THINGS 
    }; 

private: 
    int m_a = 42; 
    std::string m_b = "42"; 
}; 

Однако члены перешли из одного конструктора к другому еще не инициализирован так, в основном «случайным». Как я мог достичь чего-то подобного?

+1

Я думаю, что вопрос в том, почему вы хотите передать членов в первую очередь? Если вы не инициализируете элемент явно, он будет инициализирован значением из инициализатора в классе. – jrok

+1

Что вы хотите, чтобы значения были, если они не указаны в аргументах конструктора? Передайте эти значения по умолчанию, а не неинициализированные члены, в делегированный конструктор. –

+0

@jrok: Мне нужно вызвать полностью квалифицированный конструктор из всех остальных. – Korchkidu

ответ

1

[class.base.init]/9:

Если данный нестатический член данных имеет как скобку или равно-инициализатора и MEM-инициализатор, инициализация задается MEM-инициализатором , а нестатический элемент элемента с несимметричными данными, равный-равному-инициализатору, игнорируется.

Что оправдывает, что в главном конструкторе вы назначаете член с мусором:

DelegatingCTorPlusInClass(int a, const std::string &b) 
    : 
    m_a(a), // this is mem-initializer for m_a, so m_a = 42 is ignored and you are getting garbage 
    m_b(b) // the same for m_b 
{ 
}; 

Чтобы избежать дублирования значений по умолчанию, вы можете использовать константы для них, так что вы будете иметь что-то вроде:

DelegatingCTorPlusInClass() : DelegatingCTorPlusInClass(m_a_default, m_b_default) 
{ 
}; 
0

Вы хотите создать значения по умолчанию из конструкторов с меньшим количеством аргументов, а не полагаться на встроенную инициализацию.

class DelegatingCTorPlusInClass 
{ 
public: 
    DelegatingCTorPlusInClass() 
    : 
    DelegatingCTorPlusInClass(42, "42") // default values 
    { 
    }; 

    DelegatingCTorPlusInClass(int a) 
    : 
    DelegatingCTorPlusInClass(a, "42") 
    { 
    }; 

    DelegatingCTorPlusInClass(const std::string &b) 
    : 
    DelegatingCTorPlusInClass(42, b) 
    { 
    }; 

    DelegatingCTorPlusInClass(int a, const std::string &b) 
    : 
    m_a(a), 
    m_b(b) 
    { 
    // DO THINGS 
    }; 

private: 
    int m_a; 
    std::string m_b; 
}; 

Конструктор должен определить, какие требования к стоимости для этого использования. Инлайн-инициализация имеет смысл только тогда, когда она верна для всех конструкторов.

+0

Это не то, что я хочу на самом деле. Все дело в том, чтобы избежать дублирования этих значений по умолчанию во всем мире ... – Korchkidu

0

Вы не обязаны использовать инициализаторы элементов нестатического ввода данных и делегирование конструкторов просто потому, что они существуют. Что случилось с:

class DelegatingCTorPlusInClass 
{ 
public: 
    DelegatingCTorPlusInClass(int a = 42, std::string b = "42") 
    : m_a(a), m_b(std::move(b)) 
    { 
    // DO THINGS 
    } 

private: 
    int m_a; 
    std::string m_b; 
}; 
+1

как вам это сделать, если вы можете передать только std :: string? Затем, что произойдет, если у вас нет 2, а 10 параметров? Затем, что происходит, когда вам нужно изменить значения по умолчанию? – Korchkidu

Смежные вопросы