Я хочу удалить что-либо из списка инициализации, как мне это сделать? - PullRequest
1 голос
/ 24 января 2012

Ранее у меня было:

MyClass::MyClass() : myMember(VALUE,this,5,"etc.") { ... }

но мне нужно сделать некоторые вычисления значений, переданных конструктору myMember. Как вместо этого инициализировать myMember в теле конструктора? Я не уверен, должен ли я сделать это так:

MyMember myMember(calculatedValue,this,5,"etc.");

Ответы [ 2 ]

6 голосов
/ 24 января 2012

Инициализация всех элементов происходит до запуска тела конструктора.Поэтому, если вы сделали это:

MyClass::MyClass()
{
    myMember = MyMember(calculatedValue,this,5,"etc.");
}

, это будет присваивание, а не инициализация.Так что это не будет работать, если MyMember s не присваиваются (например, у них есть частный оператор присваивания).Это также не будет работать, если myMember объявлено как const.

Однако вы можете сделать что-то вроде этого:

class MyClass {
public:
    MyClass() : myMember(calculate(VALUE),this,5,"etc.") {}

private:
    static int calculate(int x) { return x*3; }
};

или даже что-то вроде этого:

class MyClass {
public:
    MyClass() : myMember(createMember()) {}

private:
    static MyMember createMember(int x) {
        MyMember m;
        m.foo = 5;
        ...
        return m;
    }
};

Обратите внимание, что здесь я использовал вспомогательные функции static, потому что использование не-1016 * функций-членов до завершения работы конструктора становится немного странным, в общем случае.

0 голосов
/ 24 января 2012

Если вы присваиваете член myMember внутри конструктора MyClass, вы действительно вызываете конструктор MyMember по умолчанию, а затем вызываете оператор присваивания.

Если это хорошо для вас, тогда вам просто нужно написать:

MyClass::MyClass()
{
    myMember = MyMember(calculatedValue,this,5,"etc.");
}

В противном случае вам нужен другой подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...