4 / 4 / 1
Регистрация: 27.07.2017
Сообщений: 54
1

Наследование конструктора

10.08.2017, 16:16. Показов 4382. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть структура, нужно создать объект этого класса, но конструктор доступен только наследникам этого класса:
Каким образом можно создать объект этого класса? Необходим наследник?
C++
1
2
3
4
5
6
7
struct Foo {
    void say() const { std::cout << "Foo says: " << msg << "\n"; }
protected:
    Foo(const char *msg) : msg(msg) { }
private:
    const char *msg;
};
Помогите, пожалуйста.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.08.2017, 16:16
Ответы с готовыми решениями:

Наследование с использованием конструктора.
Здравствуйте, помогите справиться с задачей: Задача: создать класс студент. Создать классы:...

Наследование конструктора из базового класса
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; ...

Нет подходящего конструктора по умолчанию. Наследование
Скидываю хидер и исходник к нему: хидер(Main_Menu.h): #include &quot;stdafx.h&quot; #ifndef...

Структура программы или наследование, без использования конструктора базового класса
Всем доброго времени суток. Снова прошу вас о помощи! Код располагается по ссылке в спойлере -...

17
69 / 68 / 52
Регистрация: 28.10.2015
Сообщений: 388
10.08.2017, 16:20 2
C++
1
2
public:
Foo(){}
0
4 / 4 / 1
Регистрация: 27.07.2017
Сообщений: 54
10.08.2017, 16:25  [ТС] 3
этот класс менять нельзя, в этом и проблема
0
Рэмбо комнатный
103 / 103 / 99
Регистрация: 05.03.2017
Сообщений: 511
10.08.2017, 16:30 4
T_e_n_Jl_bl_u, для наследования конструктор должен быть в public:
0
2338 / 1826 / 753
Регистрация: 27.07.2012
Сообщений: 5,406
10.08.2017, 16:31 5
C++
1
2
3
4
5
class Doo: public Foo
{
public:
    Doo(const char * msg) : Foo(msg) {}
};
0
4 / 4 / 1
Регистрация: 27.07.2017
Сообщений: 54
10.08.2017, 16:31  [ТС] 6
и как тогда можно создать объект класса?
0
2338 / 1826 / 753
Регистрация: 27.07.2012
Сообщений: 5,406
10.08.2017, 16:35 7
T_e_n_Jl_bl_u, конструктор для того и делают защищённым, чтобы нельзя было создать объекты этого класса, но можно было от него наследовать.
0
4 / 4 / 1
Регистрация: 27.07.2017
Сообщений: 54
10.08.2017, 16:36  [ТС] 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Foo {
public:
    void say() const { std::cout << "Foo says: " << msg << "\n";}
protected:
    Foo(const char *msg) : msg(msg) {}
private:
    const char *msg;
};
 
class Doo: public Foo
{
public:
    Doo(const char * msg) : Foo(msg) {}
};
Ошибка
[Error] 'Foo::Foo(const char*)' is protected
0
Неэпический
18113 / 10700 / 2062
Регистрация: 27.09.2012
Сообщений: 26,946
Записей в блоге: 1
10.08.2017, 16:39 9
GeFacle, откуда такие мысли?

Добавлено через 15 секунд
Цитата Сообщение от T_e_n_Jl_bl_u Посмотреть сообщение
Каким образом можно создать объект этого класса?
Например, конструктором копирования:
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
#include <iostream>
 
 
struct Foo {
    void say() const { std::cout << "Foo says: " << msg << "\n"; }
protected:
    Foo(const char *msg) : msg(msg) { }
private:
    const char *msg;
};
 
 
struct FooMaker: Foo
{
    FooMaker(const char *msg) : Foo(msg) { }
    Foo make_foo() {
        return *this;//"срезка"
    }
};
 
 
 
int main()
{
    FooMaker("message").make_foo().say();
}
http://rextester.com/ZIXOG72703
1
2338 / 1826 / 753
Регистрация: 27.07.2012
Сообщений: 5,406
10.08.2017, 16:39 10
Цитата Сообщение от T_e_n_Jl_bl_u Посмотреть сообщение
Ошибка
[Error] 'Foo::Foo(const char*)' is protected
Какой компилятор используешь?
0
4 / 4 / 1
Регистрация: 27.07.2017
Сообщений: 54
10.08.2017, 16:41  [ТС] 11
Текст задания, может вообще не по тому пути иду

Кликните здесь для просмотра всего текста



Вам дан класс Foo:

struct Foo {
void say() const { std::cout << "Foo says: " << msg << "\n"; }
protected:
Foo(const char *msg) : msg(msg) { }
private:
const char *msg;
};

Как видно, создатель класса не хотел чтобы его использовали и "спрятал" конструктор класса. Но вам очень нужен объект этого класса, чтобы передать его в функцию foo_says:

void foo_says(const Foo& foo) { foo.say(); }

В этом задании вам нужно реализовать функцию get_foo (сигнатура которой намерено не приводится в задании полностью, вам нужно подумать и вывести ее самостоятельно) так, чтобы следующий код компилировался и работал:

foo_says(get_foo(msg));

Где msg — произвольная C-style строка.

Требования к реализации: при выполнении задания вам разрешено вводить любые вспомогательные функции и классы. Запрещено изменять определение класса Foo или функции foo_says. Вводить или выводить что-либо не нужно. Реализовывать функцию main не нужно.



Добавлено через 1 минуту
MinGW в Devcpp
0
Неэпический
18113 / 10700 / 2062
Регистрация: 27.09.2012
Сообщений: 26,946
Записей в блоге: 1
10.08.2017, 16:43 12
Цитата Сообщение от T_e_n_Jl_bl_u Посмотреть сообщение
В этом задании вам нужно реализовать функцию get_foo
C++
1
2
3
4
5
6
7
8
Foo get_foo(const char *msg)
{
    struct FooMaker: Foo
    {
        FooMaker(const char *msg) : Foo(msg) { }
    };
    return FooMaker("message");
}
http://rextester.com/YUEAP56422
1
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
10.08.2017, 16:48 13
Лучший ответ Сообщение было отмечено T_e_n_Jl_bl_u как решение

Решение

Добавлено через 15 секунд
T_e_n_Jl_bl_u, можно как-нибудь так:
C++
1
2
3
4
5
6
7
8
Foo get_foo(char const* const msg) {
   struct FooAccessor : Foo {
   
      explicit FooAccessor(char const* const msg) : Foo(msg) {}
   };
   
   return FooAccessor(msg);
}
1
4 / 4 / 1
Регистрация: 27.07.2017
Сообщений: 54
10.08.2017, 16:58  [ТС] 14
Всё, разобрался, спасибо всем
0
2338 / 1826 / 753
Регистрация: 27.07.2012
Сообщений: 5,406
10.08.2017, 17:03 15
Не могу ничерта понять, почему это не работает тогда?
Цитата Сообщение от T_e_n_Jl_bl_u Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Foo {
public:
    void say() const { std::cout << "Foo says: " << msg << "\n";}
protected:
    Foo(const char *msg) : msg(msg) {}
private:
    const char *msg;
};
 
class Doo: public Foo
{
public:
    Doo(const char * msg) : Foo(msg) {}
};

Ошибка
[Error] 'Foo::Foo(const char*)' is protected
В чём тут отличие от других решений, кроме того, что наследование открытое?
0
Неэпический
18113 / 10700 / 2062
Регистрация: 27.09.2012
Сообщений: 26,946
Записей в блоге: 1
10.08.2017, 17:06 16
Цитата Сообщение от John Prick Посмотреть сообщение
почему это не работает тогда?
Работает.
http://rextester.com/PJZPCL7933
Цитата Сообщение от John Prick Посмотреть сообщение
что наследование открытое?
У нас тоже открытое.
2
2338 / 1826 / 753
Регистрация: 27.07.2012
Сообщений: 5,406
10.08.2017, 17:11 17
Цитата Сообщение от Croessmah Посмотреть сообщение
Работает.
Ну слава богу, а то я уже начал на свои куриные мозги грешить.
Цитата Сообщение от Croessmah Посмотреть сообщение
У нас тоже открытое.
Да, точно, там же struct.
0
4 / 4 / 1
Регистрация: 27.07.2017
Сообщений: 54
10.08.2017, 17:20  [ТС] 18
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
#include <iostream>
 
class Foo {
public:
    void say() const { std::cout << "Foo says: " << msg << "\n";}
protected:
    Foo(const char *msg) : msg(msg) {}
private:
    const char *msg;
};
 
class Doo: public Foo
{
public:
    Doo(const char * msg) : Foo(msg) {}
}; 
 
Foo get_foo(const char *m)
{
    Doo temp(m);
    return temp;
}
 
void foo_says(const Foo& foo) { foo.say(); }
 
int main(){
    foo_says(get_foo("Hello"));
return 0;   
}
Переписал, вроде работает
0
10.08.2017, 17:20
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.08.2017, 17:20
Помогаю со студенческими работами здесь

В чём отличия конструктора копирования и конструктора перемещения? Где и как их нужно использовать?
Помогите разобраться в копирующем и перемещающем конструкторах. В чём их существенное отличие и...

Наследование конструктора от переменного шаблона
В С++ 11 появилась возможность унаследовать конструктора базового класса при помощи конструкции...

Заменить наследование классов на наследование интерфейсов
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int...

Скобки у конструктора
Задавал подобный вопрос, однако следующий код все равно ставит меня в тупик. Почему такой код...


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

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

Новые блоги и статьи
Интеграция Arduino и ChatGPT: Практическое руководство
InfoMaster 16.01.2025
В современную эпоху технологических инноваций интеграция искусственного интеллекта с микроконтроллерами открывает принципиально новые возможности для создания умных устройств и автоматизированных. . .
Как создать робота, управляемого ChatGPT
InfoMaster 16.01.2025
Концепция проекта В современную эпоху искусственный интеллект и робототехника становятся все более доступными для энтузиастов и разработчиков. Создание роботизированной руки, управляемой ChatGPT,. . .
Как создать ChatGPT бота в Telegram на Python
InfoMaster 16.01.2025
В современном мире технологии искусственного интеллекта становятся все более доступными для разработчиков, открывая новые возможности для создания умных и интерактивных приложений. Одним из самых. . .
Машинное обучение с помощью Python
InfoMaster 16.01.2025
Машинное обучение стало неотъемлемой частью современных технологий, позволяя компьютерам учиться на основе данных и принимать решения без явного программирования. В сочетании с языком. . .
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru