class A
{
// тут стописят внутренних переменных классаpublic:
A();
A(int i);
A(char c);
};
при этом
A::A()
{
// стописят строчек кода по иничиализации внутренних переменных класса
}
...хочется, чтобы в двух других конструкторах была таже самая инициализация, но не хочется писать триста строчек кода.
Как из них выполнить дефолтный конструтор
Здравствуйте, CEMb, Вы писали:
CEM>Видимо, туплю
CEM>Есть класс с конструкторами:
CEM>
CEM>class A
CEM>{
CEM> // тут стописят внутренних переменных класса
CEM>public:
CEM> A();
CEM> A(int i);
CEM> A(char c);
CEM>};
CEM>
CEM>при этом
CEM>A::A()
CEM>{
CEM> // стописят строчек кода по иничиализации внутренних переменных класса
CEM>}
CEM>
CEM>...хочется, чтобы в двух других конструкторах была таже самая инициализация, но не хочется писать триста строчек кода. CEM>Как из них выполнить дефолтный конструтор
Здравствуйте, CEMb, Вы писали:
CEM>...хочется, чтобы в двух других конструкторах была таже самая инициализация, но не хочется писать триста строчек кода. CEM>Как из них выполнить дефолтный конструтор
Увы, никак. Можно написать функцию Init, в которую перенести инициализацию, и вызывать ее из конструкторов.
Здравствуйте, CEMb, Вы писали:
CEM>...хочется, чтобы в двух других конструкторах была таже самая инициализация, но не хочется писать триста строчек кода. CEM>Как из них выполнить дефолтный конструтор
Либо выноси общий код в отдельную функцию и зови ее.
Либо, если там именно инициализация, а не просто код работает по инициализированным данным, сделай базовый класс с этим огромным конструктором и зови его.
CEMb wrote:
> M>A::A() { ... } > > M>A::A(int i) : A() { i_ = i; } > > M>A::A(char c) : A() { c_ = c; } > M> > > > > На это оно ругается > > error C2614: 'A' : illegal member initialization: 'A' is not a base > or member
Это, наверное, была шутка. Это вам не Java.
Чтобы сделать такое, тебе нужно сделать отдельную функцию
инициализации, вероятно, приватную, и вызывать
её из каждого конструктора. При этом делать инициализацию
в списке инициализациии не получится.
Если нужно делать инициализацию в списке инициализации,
то придётся написать N функций, для каждого member-а.
Каждая функция должна быть статической и не присваивать в
теле мемберу что-то, а возвращать это что-то в виде значения:
class A
{
....
private:
static int initValFor_i(int i)
{
return i + 10;
}
};
Здравствуйте, CEMb, Вы писали:
CEM>Видимо, туплю
CEM>Есть класс с конструкторами:
CEM>
CEM>class A
CEM>{
CEM> // тут стописят внутренних переменных класса
CEM>public:
CEM> A();
CEM> A(int i);
CEM> A(char c);
CEM>};
CEM>
CEM>при этом
CEM>A::A()
CEM>{
CEM> // стописят строчек кода по иничиализации внутренних переменных класса
CEM>}
CEM>
CEM>...хочется, чтобы в двух других конструкторах была таже самая инициализация, но не хочется писать триста строчек кода. CEM>Как из них выполнить дефолтный конструтор
если у класса нет паблик предков, нужных конструктору, то
class A_data
{
public:
// тут стописят внутренних переменных классаpublic:
A_data();
{
// стописят строчек кода по иничиализации внутренних переменных класса
}
};
class A : private A_data
{
public:
A();
A(int i);
A(char c);
};
Если вся инициализация — обнуление, то "стописят строчек кода " не нужны, вместо этого добавить зануление в class A
struct A_data
{
...
}
class A : private A_data
{
public:
A() : A_data();
A(int i) : A_data();
A(char c) : A_data();
};
Но осторожно, на MSVC не работает, если в A_data классы с пользователским конструктором.
Здравствуйте, Alexander G, Вы писали:
AG>Если вся инициализация — обнуление, то "стописят строчек кода " не нужны, вместо этого добавить зануление в class A
Если вся инициализация — обнуление, используйте умные типы членов — auto_value и т.п.
Здравствуйте, x905, Вы писали:
X>... CEM>> // тут стописят внутренних переменных класса X>...
X>это не класс — это помойка X>перепроектируй
Не, ну всё не совсем так, я просто чтобы было видно хорошо, что ищется.
На самом деле всё немного сложнее. Есть некий класс, который не имеет дефолтного конструктора. Остальных конструкторов у него "много". Причём, на данный момент, на входе конструктора "ведущим" является первый параметр. Он бывает (двух) разных типов. Внутри инициализируется один и тот же объект, но в зависимости от того, с каким классом первого параметра позвали, деинициализация будет разной. За это отвечает внутренний флаг, который в одном конструкторе взводится в TRUE, в другом в FALSE.
Далее. Первым параметром дело не оканчивается, в зависимости от следующих параметров взводятся другие флаги. Получается такая не совсем древесная структура зависимости входных параметров от первых(вторых, третьих).
Т.е. хотелось чего (напишу кодом, русского языка не хватает...)
class A
{
A(A1 a){…}
A(A2 a){…}
// ...
A(A1 a, B1 b){…}
A(A1 a, B2 b){…}
A(A2 a, C1 b){…}
A(A2 a, C2 b){…}
A(A2 a, C2 b, D d){…}
};
вот в данном случае, хочется, чтобы 3 и 4 конструкторы делали инициализацию, которую делает первый, а 5 и 6 — 2. А 7 конструктор, делал инициализацию 6-го. Все инициализации отличаются по флагам(не просто обнуление). У меня сейчас схема чуть проще, но она разрастётся и станет сложнее. Плодить стописят родительских классов тоже не хочется.
Здравствуйте, CEMb, Вы писали:
CEM>Здравствуйте, x905, Вы писали:
X>>... CEM>>> // тут стописят внутренних переменных класса X>>...
X>>это не класс — это помойка X>>перепроектируй
CEM>Не, ну всё не совсем так, я просто чтобы было видно хорошо, что ищется.
о ужас !
зачем столько конструкторов ?
сам это пишеш или в "наследство" эти классы свалились?
делай простые классы, а не один "всемогущий" класс — его же поддерживать невозможно будет
и еще раз — перепроектируй класс
Здравствуйте, x905, Вы писали:
X>о ужас !
да -_-
X>зачем столько конструкторов ?
Чтобы легче было в коде писать создание объекта в одну строчку. Ибо замучился каждый раз писать несколько строчек "одинакового" кода.
X>сам это пишеш или в "наследство" эти классы свалились?
Сам.
X>делай простые классы, а не один "всемогущий" класс — его же поддерживать невозможно будет
Он не всемогущий, он под один объект. Который может быть создан разными путями (по секрету всему свету — это надстройка на объект из win32)
X>и еще раз — перепроектируй класс
Попробую.
Здравствуйте, CEMb, Вы писали:
CEM>...хочется, чтобы в двух других конструкторах была таже самая инициализация, но не хочется писать триста строчек кода. CEM>Как из них выполнить дефолтный конструтор
Предлагаю тебе такой ход:
1) Пишешь кучу приватных методов вида: initWith( arg1 ); initWith( arg1, afg2 ); initWith( arg1, afg2, arg3 );
В которых помещаешь все свои премудрости с деревом инициализации объекта, в зависимости от типов параметров конструктора.
2) Пишешь явный конструктор копии (или явно его банишь, если надо)
3) И пишешь несколько шаблонных конструкторов вида:
Ну собственно и наслаждаешься достигнутым эффектом
Если не охота возиться с шаблонами методов, то все те же конструкторы можно и руками быстренько наколотить и макросом каким-нибудь...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, CEMb, Вы писали:
CEM>(по секрету всему свету — это надстройка на объект из win32)
Тогда очень похоже на то, что на самом деле не особо нужно использовать список инициализации, поэтому общие части конструкторов можно повыносить в отдельные методы.