0 / 0 / 0
Регистрация: 28.10.2020
Сообщений: 20

Конструкторы

31.07.2022, 15:22. Показов 1775. Ответов 11

Студворк — интернет-сервис помощи студентам
Всем добрый день!

Скажите, пожалуйста, почему здесь нужно именно три отдельных конструктора, почему я не могу запихнуть все параметры в один?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/ Конструктор по умолчанию
  Ball() {
    m_color = "red";
    m_radius = 20.0;
  }
  // Конструктор с параметрами для color
  Ball(const string &color) {
    m_color = color;
    m_radius = 20.0;
  }
  //Конструктор с параметрами для radius
  Ball(double radius) {
    m_color = "red";
    m_radius = radius;
  }
  Ball(const string& color, double radius) {
    m_color = color;
    m_radius = radius;
  }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.07.2022, 15:22
Ответы с готовыми решениями:

Конструкторы
У меня есть два конструктора: первый по умолчанию Circle() //Конструктор по умолчанию (инициализирует переменные) { itsRadius =...

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

Конструкторы
Почему, если класс имеет конструктор с параметрами у него обязательно должен быть конструктор по умолчанию?

11
2642 / 1653 / 267
Регистрация: 19.02.2010
Сообщений: 4,375
31.07.2022, 15:39
Kikiiiii132, не в ответ на заданный вопрос - но:
Цвет в виде строки в поле класса - аццкий говнокод.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
31.07.2022, 15:41
Цитата Сообщение от Kikiiiii132 Посмотреть сообщение
почему здесь нужно именно три отдельных конструктора
Сколько и каких конструкторов нужно - решает программист. Тут нет каких-то требований.
Цитата Сообщение от Kikiiiii132 Посмотреть сообщение
почему я не могу запихнуть все параметры в один?
Функционал этих конструкторов можно "запихнуть" в минимум два, но никак не в один:
C++
1
2
3
4
5
6
7
8
  Ball(const string& color = "red", double radius = 20.0) {
    m_color = color;
    m_radius = radius;
  }
 
  //Конструктор с параметрами для radius
  Ball(double radius) : Ball("red", radius) {
  }
0
0 / 0 / 0
Регистрация: 28.10.2020
Сообщений: 20
31.07.2022, 16:41  [ТС]
Так почему?

Добавлено через 1 минуту
Это настройки сайта, спасибо
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
31.07.2022, 16:42
Цитата Сообщение от Kikiiiii132 Посмотреть сообщение
Так почему?
Что почему?
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,813
31.07.2022, 20:43
Цитата Сообщение от Kikiiiii132 Посмотреть сообщение
именно три отдельных конструктора, почему я не могу запихнуть все параметры в один?
У вас четыре конструктора, а не три.
Можно и в один запихнуть, только извратиться немножко с порядком параметров нужно будет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <utility>
#include <type_traits>
 
class Ball
{
    template <typename T, typename T1>
    static constexpr auto best_match(T1 const& a, T const& b) { return b; }
    template <typename T, typename T2>
    static constexpr auto best_match(T const& a, T2 const& b) { return a; }
 
public:
 
// тот самый один конструктор начался
    template <typename T1 = std::string
            , typename T2 = std::conditional_t<std::is_convertible_v<T1, std::string>, double, std::string>
            , typename = std::enable_if_t<
                  (std::is_convertible_v<T1, std::string> && std::is_convertible_v<T2, double>)
               || (std::is_convertible_v<T2, std::string> && std::is_convertible_v<T1, double>)
              >
    >
    Ball(T1 f = best_match<T1>("red", 20.0), T2 s = best_match<T2>("red", 20.0))
        : m_color(best_match<std::string>(f, s)), m_radius(best_match<double>(f, s))
    { }
// тот самый один конструктор закончился
    
private:
    std::string m_color;
    double m_radius;
};
Онлайн пример: https://rextester.com/JEQ2512

(На всякий случай: я никому не рекомендую так делать в реальных задачах).
1
31.07.2022, 20:58

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
тот самый один конструктор
Формально это шаблон конструктора, фактически же там у вас два конструктора инстанцируются, если я правильно посчитал :)

0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,813
31.07.2022, 21:05
Цитата Сообщение от zayats80888 Посмотреть сообщение
Формально это шаблон конструктора, фактически же там у вас два конструктора инстанцируются, если я правильно посчитал
Формально, да.
Но этот ответ исходил из того, что человек спрашивал сколько кода ему можно\нельзя писать, а не во что он превращается.

Ну и инстанций там побольше чем две будет.
0
31.07.2022, 21:32

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Ну и инстанций там побольше чем две будет.
Действительно, не учел const char[] -> std::string.

Попробовал до двух сократить, но не понял откуда инстанс Ball<const char *, double, void> взялся.
Это баг сайта или я что-то не догоняю?
https://cppinsights.io/s/4c4cc6a4

0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,813
31.07.2022, 22:02
Цитата Сообщение от zayats80888 Посмотреть сообщение
Это баг сайта или я что-то не догоняю?
Нет, не баг.
Чтобы не было инстанции от const char*, нужно добавить ссылки к параметрам
C++
1
Ball(T1 const& f = best_match<T1>("red", 20.0), T2 const& s = best_match<T2>("red", 20.0))
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
31.07.2022, 22:22

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
нужно добавить ссылки к параметрам
Только теперь появились инстансы с char[4] и char[5], но откуда они там взялись, если я все литералы суффиксом s дополнил??



Добавлено через 9 минут

Не по теме:

Не, похоже это просто побочный выхлоп компилятора/сайта, т.к. это просто объявления. С определениями там только два инстанса. Это я так, из любопытства...

0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
01.08.2022, 13:19
Лучший ответ Сообщение было отмечено Kikiiiii132 как решение

Решение

Цитата Сообщение от Kikiiiii132 Посмотреть сообщение
Скажите, пожалуйста, почему здесь нужно именно три отдельных конструктора, почему я не могу запихнуть все параметры в один?
Набор конструкторов и их параметры регулируются в основном техническими ограничениями, здравым смыслом и целесообразностью.

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

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

Вас ничто не ограничивает от того, чтоб оставить один конструктор со всеми параметрами и изменить все места использования исчезнувших конструкторов.

Более того, в больших проектах так чаще всего и делают по причинам удобства поддержки кода.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.08.2022, 13:19
Помогаю со студенческими работами здесь

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

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

Конструкторы
Добрый вечер! Являюсь новичком и столкнулась с вот такой проблемой. Имеется класс Product, а от него наследуется MilkProduct. В одной из...

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

Конструкторы
Всем доброго дня, хотел спросить почему вот такая штука происходит template&lt;typename First&gt; class Test { private: ...


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

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

Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru