Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
zhdv06
0 / 0 / 0
Регистрация: 07.12.2014
Сообщений: 9
#1

Делегирующие конструкторы и наследование - C++

11.04.2016, 19:50. Просмотров 432. Ответов 10
Метки нет (Все метки)

Возможно ли использовать делегирующие конструкторы когда нужно инициализировать базовый класс?
Например есть два таких конструктора:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
ComPortSettings::ComPortSettings(QWidget *parent) :
    QComboBox(parent)
{
    // init();
}
 
ComPortSettings::ComPortSettings(const QString &title, QWidget *parent) :
    QComboBox(title, parent)
{
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2016, 19:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Делегирующие конструкторы и наследование (C++):

Наследование, конструкторы - C++
Что не верно в таком объявлении : class P{ public: P(int n); }; class Ch:public P{ public: Ch(int n):P(n); };

наследование. конструкторы - C++
#include <iostream> using namespace std; #include <locale> #include <time.h> #include <windows.h> class TArray { ...

Наследование классов и конструкторы - C++
#include <stdio.h> #include <conio.h> class form { public: form(){printf("form::form()\n");}; ...

Заменить наследование классов на наследование интерфейсов - C++
#include <iostream> #include <assert.h> using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Конструкторы - C++
#include<iostream> class A { public: A(int x) : _x(x) {} private: int _x; }; int main() ...

конструкторы - C++
У меня вопрос: если программа с конструкторами, то нужно ли создавать объект в программе? И по какому синтаксису вызвать функцию, описанную...

10
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
11.04.2016, 19:56 #2
Цитата Сообщение от zhdv06 Посмотреть сообщение
Возможно ли использовать делегирующие конструкторы когда нужно инициализировать базовый класс?
Возможно. И даже очень удобно и полезно.
0
zhdv06
0 / 0 / 0
Регистрация: 07.12.2014
Сообщений: 9
12.04.2016, 10:14  [ТС] #3
castaway, покажи пример пожалуйста.
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
12.04.2016, 18:51 #4
Так вы же сами привели пример делегирования. Объект QComboBox инициализируется при создании объекта ComPortSetting.
0
zhdv06
0 / 0 / 0
Регистрация: 07.12.2014
Сообщений: 9
12.04.2016, 19:24  [ТС] #5
Я имел ввиду новое средство С++11 - делегирующий конструктор.
Любой конструктор может вызвать любой другой перегруженный конструктор данного класса отличный от самого себя.

Например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Rectangle
{
public:
    Rectangle(size_t width, size_t height):
        m_Width(width),
        m_Height(height)
    {
        std::cout << "Target ctor\n";
    }
    Rectangle(size_t width):
        Rectangle(width, width)
    {
        std::cout << "Delegate ctor\n";
    }
private:
    size_t m_Width;
    size_t m_Height;
};
Когда класс сам по себе, тогда все понятно как использовать.
Но когда производный класс вызывает конструктор базового, вот тут не понимаю как написать.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
ComPortSettings::ComPortSettings(QWidget *parent) :
    QComboBox(parent)
{
    // init();
}
 
ComPortSettings::ComPortSettings(const QString &title, QWidget *parent) :
    QComboBox(title, parent)
{
}
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
12.04.2016, 19:36 #6
Насколько мне известно, делегирующий конструктор не имеет отношения к механизму наследования.
Пример делегирования:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
struct A {
    A() : A( 123 ) { std::cout << "A::A()\n"; }
    A( int i ) { std::cout << "A::A( " << i << " )\n"; }
};
 
int main() {
    A a;
}
У вас в последнем примере просто список инициализации конструктора.
0
zhdv06
0 / 0 / 0
Регистрация: 07.12.2014
Сообщений: 9
12.04.2016, 19:48  [ТС] #7
Если я напишу примерно так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
// 1
ComPortSettings::ComPortSettings(QWidget *parent) :
    QComboBox(parent)
{
    // init();
}
// 2 
ComPortSettings::ComPortSettings(const QString &title, QWidget *parent) :
    ComPortSettings(parent), QComboBox(title, parent)
{
}
При вызове 2-го конструктора он вызовет 1-й.
1-й вызовет конструктор базового класса.
После окончания работы 1-го 2-й тоже вызовет конструктор базового класса.
И что здесь получится?
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
12.04.2016, 20:01 #8
Цитата Сообщение от zhdv06 Посмотреть сообщение
И что здесь получится?
Получится фигня, но ваш изначальный вопрос звучал по-другому.
0
zhdv06
0 / 0 / 0
Регистрация: 07.12.2014
Сообщений: 9
13.04.2016, 05:04  [ТС] #9
Возможно я неправильно сформулировал свой вопрос.

Как использовать это?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
// 1
ComPortSettings::ComPortSettings(QWidget *parent) :
    QComboBox(parent)
{
    // init();
}
// 2 
ComPortSettings::ComPortSettings(const QString &title, QWidget *parent) :
    ComPortSettings(parent), QComboBox(title, parent)
{
}
0
Usaga
Эксперт .NET
2251 / 1919 / 352
Регистрация: 21.01.2016
Сообщений: 7,359
Завершенные тесты: 2
13.04.2016, 07:34 #10
zhdv06, ни как. Такой код не скомпилируется, ибо не допускается делегирование более чем одному конструктору.
1
zhdv06
0 / 0 / 0
Регистрация: 07.12.2014
Сообщений: 9
13.04.2016, 18:44  [ТС] #11
Я получил от вас подтверждение что такой код работать не будет.
Тема исчерпана.
Спасибо за ответы.
0
13.04.2016, 18:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2016, 18:44
Привет! Вот еще темы с ответами:

Конструкторы С++ - C++
Всем привет, помогите довести программу до ума :) Заранее благодарю откликнувшихся :) ...

конструкторы - C++
Доброе время суток! Помогите разобраться с конструктором. Что это такое и с чем его едят. Так как сдала лабу преподавателю, ну вроде ж...

Конструкторы - C++
class A { public: A() : a(10) // инициализация a { b = 3; // присвоение b } int a, b; };

Конструкторы C++ - C++
Объясните, пожалуйста, своими словами, что являют собой конструкторы, для чего они нужны, в чем их преимущество перед аналогичными...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru