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

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

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

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

Скажите, пожалуйста, почему здесь нужно именно три отдельных конструктора, почему я не могу запихнуть все параметры в один?
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() //Конструктор по умолчанию...

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

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

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

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

11
1609 / 1511 / 251
Регистрация: 19.02.2010
Сообщений: 4,078
31.07.2022, 15:39 2
Kikiiiii132, не в ответ на заданный вопрос - но:
Цвет в виде строки в поле класса - аццкий говнокод.
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
31.07.2022, 15:41 3
Цитата Сообщение от 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  [ТС] 4
Так почему?

Добавлено через 1 минуту
Это настройки сайта, спасибо
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
31.07.2022, 16:42 5
Цитата Сообщение от Kikiiiii132 Посмотреть сообщение
Так почему?
Что почему?
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
31.07.2022, 20:43 6
Цитата Сообщение от 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
zayats80888
31.07.2022, 20:58
  #7

Не по теме:

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

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

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

Не по теме:

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

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

0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
31.07.2022, 22:02 10
Цитата Сообщение от 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
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
31.07.2022, 22:22 11

Не по теме:

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



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

Не по теме:

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

0
4866 / 2664 / 914
Регистрация: 29.11.2010
Сообщений: 5,747
01.08.2022, 13:19 12
Лучший ответ Сообщение было отмечено Kikiiiii132 как решение

Решение

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

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

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

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

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

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

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

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

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

Конструкторы
Объясните на пальцах, для чего нужны конструкторы?


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

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

Новые блоги и статьи
Как написать микросервис на Go/Golang
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C#
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта Gowin Eda и снимок. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru