Инициализация класса члена объекта с использованием конструктора не по умолчанию в C ++ - PullRequest
1 голос
/ 22 сентября 2011

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

Сначала мой заголовок:

Class MyObject {

 protected:
    double some variable;
    boost::random::mt19937 rgenerator;
    boost::uniform_real<double> dist_0_1;
    boost::variate_generator< boost::mt19937&, boost::uniform_real<double> > rand01
}

Теперь я хочу сделать следующее:

Class MyObject {

 protected:
    double some variable;

    boost::random::mt19937 rgenerator(std::time(0)); //initialize to a "random" seed
    boost::uniform_real<double> dist_0_1(0,1); //set the distribution to 0-1
    boost::variate_generator< boost::mt19937&, boost::uniform_real<double> > rand01(rgenerator, dist_0_1);//tell it to use the above two objects
}

Но это не работает, потому что это в заголовке.Я подумал, что мог бы использовать конструктор MyObject, чтобы каким-то образом вызывать конструкторы для различных подобъектов (распределение, генератор, но я не могу понять, как. К тому времени, когда вызывается конструктор MyObject, суб-объекты по умолчаниюконструкторы уже были вызваны, и я не обнаружил, что у них есть методы-члены для сброса этих свойств ... кроме того, это не тот момент, когда я запутался. Теперь, может быть, происходит слишком много вещей, и я 'Это запутанные проблемы, но, насколько я могу судить, моя проблема сводится к следующему детскому примеру:

Class Tree {

    Tree();
    Tree(int);

    protected: 

        fruit apples(int);
}

Tree::Tree() {
    apples(0); //won't work because we can't call the constructor again?
}

Tree::Tree(int fruit_num) {
    apples(fruit_num); //won't work because we can't call the constructor again?
}

Class Fruit {

    public:
        Fruit();
        Fruit(int);

    protected:
        int number_of_fruit;

}

Fruit::Fruit() {

    number_of_fruit = 0;
}

Fruit::Fruit(int number) {

    number_of_fruit = number;

}

Я уверен, что это вторая натура для всех остальных, но я не могунайдите статью, в которой рассказывается о наилучшей практике инициализации объектов-членов объекта значением конструктора, отличного от заданного по умолчанию.

Ответы [ 3 ]

6 голосов
/ 22 сентября 2011

То, что вы хотите, это список инициализатора.Например:

Tree::Tree(int fruit_num) 
    : apples(fruit_num) // Initializes "apple" with "fruit_num"
{
}

Вы просто добавляете двоеточие (:) после параметров конструктора и перед открывающей скобкой {.Вы можете разделять различные конструкторы-члены запятыми (,).Пример:

Tree::Tree(int fruit1, int fruit2) : apples(fruit1), bananas(fruit2) {
}
2 голосов
/ 22 сентября 2011

Ты так близко!Просто используйте синтаксис списка инициализатора:

Tree::Tree() : apples(0) {
    // ...
}

Tree::Tree(int fruit_num) : apples(fruit_num) {
    // ...
}
2 голосов
/ 22 сентября 2011

Ответ на этот вопрос относительно прост. Вы используете списки инициализаторов.

Вот пример:

class MyClass {
private:
     SomeOtherType sot;
public:
    MyClass() : sot(parametersForConstructorOfSOT) {}
};

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

...