class complex_c1 {
private:
c1 *my_c1;
public:
complex_c1 (int i1, int i2 /*, другие параметры*/)
{
my_c1 = new c1(i1,i2);
//...
}
complex_c1 (c1 &defc1)
{
my_c1 = new c1(defc1);
//...
}
~complex_c1() {
delete my_c1;
}
};
класс внутри класса. операторы new & delete для классов.
конструктор такой: c1(int i1, int i2):I1(i1),I2(i2) {}
еще есть copy constructor: с1(c1 &defc1) //...
и деструктор: ~c1() { /*...*/ }
я создаю другой класс:
Код:
При вызове обоих конструкторов complex_c1 экземпляр внутреннего класса создается нормально, однако при выходе из конструкторов вызывается деструктор внутреннего класса c1!
В одной книге нашел немного информации и изменил complex_c1:
Код:
class complex_c1 {
private:
c1 &my_c1;
public:
/*
complex_c1 (int i1, int i2 /*, другие параметры*/)
{
my_c1 = new c1(i1,i2);
//...
}
*/
complex_c1 (c1 &defc1) : my_c1(defc1);
{
//...
}
~complex_c1() {
delete my_c1;
}
};
private:
c1 &my_c1;
public:
/*
complex_c1 (int i1, int i2 /*, другие параметры*/)
{
my_c1 = new c1(i1,i2);
//...
}
*/
complex_c1 (c1 &defc1) : my_c1(defc1);
{
//...
}
~complex_c1() {
delete my_c1;
}
};
Теперь при вызове complex_c1(c1 &defc1) внутренний класс не разрушается при выходе из конструктора, однако при попытке объявить конструктор
complex_c1 (int i1, int i2 /*, другие параметры*/) : my_c1(i1,i2) {}
не компилируется, выдает:
initialization of reference member requires a temporary variable.
Как мне вызвать конструктор
c1(int i1, int i2)
из
complex_c1 (int i1, int i2 /*, другие параметры*/)
нормально ??
Есть ли возможность нормального создания внутренних объектов вне initialization list
(то есть вне конструкции :v1(iv1),v2(iv2)...{})?
Есть ли такая возможность при объявлении внутреннего объекта как c1 *my_c1;
Подскажите пжлст, кто знает!!
Может у кого есть ссылка, где можно взять подробную информацию об использовании классов внутри классов, о порядке вызова деструкторов в сях??
2. Первый вариант кода верен. Деструктор вызывается от куда-то из другого места. Проверь ещё раз.
3. Второй вариант коде неверен. Ты даешь себе отчет, что используешь ссылку и что вообще такое ссылка? Советую почитать про ссылке в языке С++.
4. Вопрос: а для чего ты используешь внутри класса то указатель, то ссылку, а не просто объект, т.е. почему бы не так c1 my_c1; ?
5. Инициализировать поля вне списка инициализации нельзя. Можно только присваивать значения в теле конструктора.
6. В "сях" нет деструкторов, деструкторы есть только в С++.
7. Ответы на твои вопросы есть в любой книге по С++ для начинающих.
Цитата:
4. Вопрос: а для чего ты используешь внутри класса то указатель, то ссылку, а не просто объект, т.е. почему бы не так c1 my_c1; ?
Насколько я понимаю, когда объявляешь поле как c1 my_c1, необходимо иметь дефаулт-конструктор без параметров для c1. И он будет вызываться неявно при вызове конструктора класса-контейнера, так?
Честно говоря не до конца понимаю, как вызываются деструкторы в с++. Как я понял, явно их вызвать нельзя, компилятор сам вставляет вызов деструктора в код программы, когда считает нужным, так?
Насколько я понимаю, когда объявляешь поле как c1 my_c1, необходимо иметь дефаулт-конструктор без параметров для c1. И он будет вызываться неявно при вызове конструктора класса-контейнера, так?
[/QUOTE]
Можно и с параметрами. Просто в конструкторе главного класса надо будет передать ему нужные параметры. Например:
Код:
class MainClass{
private:
SubClass obj;
...
public:
MainClass(Type1 p1, Type2 p2) : obj(p1, p2);
...
};
private:
SubClass obj;
...
public:
MainClass(Type1 p1, Type2 p2) : obj(p1, p2);
...
};
[QUOTE=littlefrankie]
Честно говоря не до конца понимаю, как вызываются деструкторы в с++. Как я понял, явно их вызвать нельзя, компилятор сам вставляет вызов деструктора в код программы, когда считает нужным, так?[/QUOTE]
Деструкторы вызываются когда разрушается объект. Тоесть или когда явно процесс выполнения выходит из области видимости где была описанна переменная класса. Или при удалении указателя на объект, если он был создан динамически с помощью оператора new например.
Вручную вызвать можно, но ненужно. Это не правильно и может привести (и скорее всего и приведет) к плоххим последствиям. =))
Поскольку деструктор как раз и создан для того, чтобы выполнять нужные действия при разрушении объекта: освобождение ресурсов, сохранение каких то параметров и и.п. Тоесть вызываться должен один раз, а в случае вызова вручную, он будет еще раз вызван автоматически.