Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
7 / 7 / 9
Регистрация: 22.10.2015
Сообщений: 74
1

Компиляция кода с ромбовидным наследованием

16.12.2016, 09:50. Показов 1661. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Я написал элементарное наследование. На VS 2015 всё компилится, а на CLion нет. В чём может быть проблема?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A {
protected:
    int a;
public:
    A(int i) : a(i) {}
};
 
class B : public A {
public:
    B(int i) : A(i) {}
};
 
class C : public B, public A {
public:
    C(int i1, int i2) : B(i1), A(i2) {}
    void print() { std::cout << "B(" << B::a << "), A(" << A::a << ")"; }
};
 
int main()
{
    C cc(2, 1);
    cc.print();
}
Причём если не обращаться к полю класса, то всё хорошо, но при обращении вылетает ошибка
error: ‘A’ is an ambiguous base of ‘C’

У меня есть только одно предположение. В VS выдаётся точно такое же сообщение, но в качестве предупреждения, а не ошибки. Возможно в CLion другой уровень возбуждения этой ошибки и можно прописать #pragma warning(disable : ) и всё начнёт работать как надо?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2016, 09:50
Ответы с готовыми решениями:

Компиляция/добавление кода без видимости самого кода(сложно объяснить)
Есть код по типу такого: static void Main() { Hm.Ex checker = new Hm.Ex();//Hm -...

Исполнение кода, написанного в текстовом файле (динамическая компиляция кода)
к примеру есть у меня форма а на ней кнопка, можно ли присваивать код кнопке с текстового файла? ...

Формирование низкоуровневого кода (компиляция кода на С из текстового файла)
Доброго времени суток, форумчане. Необходима информация о трансляции Си (без плюсов и решеток)...

Компиляция кода
Здраствуйте,есть код на хаскелле,при компиляции через сервис http://codepad.org/ жалуется на 9ую...

31
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
16.12.2016, 10:05 2
ну а что вы хотели? у вас в классе С "находиться" 2 экземпляра класса А (он его наследует напрямую и через B)

Добавлено через 1 минуту
Цитата Сообщение от LoSyAsH Посмотреть сообщение
и всё начнёт работать как надо?
работать может и начнет, но такая запись в принципе недопустима и бесполезна...
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
16.12.2016, 10:06 3
Ну а вы чего хотели? Классический пример применения виртуального наследования:
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
#include <iostream>
class A {
protected:
    int a;
public:
    A(int i) : a(i) {}
};
 
class B : virtual public A {
public:
    B(int i) : A(i) {}
};
 
class C : public B, virtual public A {
public:
    C(int i1, int i2) : B(i1), A(i2) {}
    void print() { std::cout << "B(" << B::a << "), A(" << A::a << ")"; }
};
 
int main()
{
    C cc(2, 1);
    cc.print();
}
0
7 / 7 / 9
Регистрация: 22.10.2015
Сообщений: 74
16.12.2016, 10:46  [ТС] 4
Мне как раз и нужно, чтобы в C было 2 элемента a. Один из класса A, второй - из B. Это нам в универе объясняли наследование. И надо было реализовать следующую цепочку наследований (я понимаю, что в этом случае должно быть не наследование классов, а их вложение, но для закрепления материала нужно реализовать через наследование). И всё сводится к тому, что B наследует A, а C наследует B и A. И класс A должен быть в классе C в двух экземплярах.
Миниатюры
Компиляция кода с ромбовидным наследованием  
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
16.12.2016, 10:55 5
Цитата Сообщение от LoSyAsH Посмотреть сообщение
И класс A должен быть в классе C в двух экземплярах.
что приводит к неоднозначности... люди решают такие проблемы, а вы наоборот пытаетесь ее сделать))))
а ну да, это не ромбовидное наследование)

Добавлено через 2 минуты
вот вам "ромбовидное наследование" (если такой термин вообще есть):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
class A
{};
 
class B: virtual public A
{};
 
class C: virtual public A
{};
 
class D: public B, public C
{ };
 
int main()
{
  return 0;
}
Добавлено через 1 минуту
и на картиночке у вас нет ни одного класса, который бы наследовался так, как пишите вы...
0
7 / 7 / 9
Регистрация: 22.10.2015
Сообщений: 74
16.12.2016, 11:04  [ТС] 6
Цитата Сообщение от JIawliet Посмотреть сообщение
а ну да, это не ромбовидное наследование)
Извиняюсь, ошибся. Но что делать, если такое дали задание. Мы немного ушли от темы. Я всё это написал и под VS запустил, но на CLion не смог из за ошибки. А вот почему эта ошибка в VS не возникает, а в CLion возникает - не понял.

Добавлено через 2 минуты
Цитата Сообщение от JIawliet Посмотреть сообщение
и на картиночке у вас нет ни одного класса, который бы наследовался так, как пишите вы...
вот кусок кода
C++
1
class cPC : public cVideoAdapter, public cHDD, public cCPU, public cRAM
C++
1
class cVideoAdapter : public cRAM, public cGPU
Добавлено через 2 минуты
Класс RAM должен быть и в VideoAdapter и в PC. Причём в PC у меня должен быть RAM для PC и RAM для VideoAdapter

Добавлено через 1 минуту
Я могу скинуть весь проект, но он большой и в нём не очень удобно ориентироваться.
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
16.12.2016, 11:04 7
LoSyAsH, вам нужно в настройках компилятора CLion покопаться.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
16.12.2016, 11:05 8
Лучший ответ Сообщение было отмечено LoSyAsH как решение

Решение

Цитата Сообщение от JIawliet Посмотреть сообщение
и на картиночке у вас нет ни одного класса, который бы наследовался так, как пишите вы...
Есть. От него там действительно хотят, чтобы класс RAMInfo порождал при наследовании один подобъект для GPUInfo и другой для PCInfo. Я думаю, имеется в виду, что это разная память (оперативная и on-board ram в видеокарте), соответственно объекты тоже должны быть разные. Давать оценку этому архитектурному ходу дело неблагодарное, я бы конечно учить наследованию не начинал с таких спорных примеров, но задание есть задание. Он его не сможет, скорее всего, изменить.

LoSyAsH, скорее всего где-то выставлен ключ -Werror, который заставляет компилятор трактовать предупреждения как ошибки.
Неоднозначность действительно будет (предупреждение совершено справедливо), нужно будет тебе подумать, как эту неоднозначность разрешать.
3
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
16.12.2016, 11:06 9
тут определенно нужно применять виртуальное наследование)))

зачем нашему PCInfo (информация о компьютере) дублирование информации о RAM, MemoryInfo, и т.д.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
16.12.2016, 11:12 10
Цитата Сообщение от LoSyAsH Посмотреть сообщение
вот кусок кода
Очень зря ты убрал слово info из названий классов. Если для классов информации еще можно как-то за уши притянуть наследование, то вот компьютер от видеокарты точно не наследуется! Не усугубляй и без того шаткое положение
0
7 / 7 / 9
Регистрация: 22.10.2015
Сообщений: 74
16.12.2016, 11:12  [ТС] 11
Вот сам проект
Вложения
Тип файла: rar Новая папка.rar (2.9 Кб, 1 просмотров)
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
16.12.2016, 11:12 12
Цитата Сообщение от DrOffset Посмотреть сообщение
Я думаю, имеется в виду, что это разная память (оперативная и on-board ram в видеокарте), соответственно объекты тоже должны быть разные.
наверно самое логичное объяснение
0
7 / 7 / 9
Регистрация: 22.10.2015
Сообщений: 74
16.12.2016, 11:13  [ТС] 13
Цитата Сообщение от DrOffset Посмотреть сообщение
компьютер от видеокарты точно не наследуется! Не усугубляй и без того шаткое положение
Я это понимаю. И на паре нас об этом тоже предупредили. Но реализовать надо...
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
16.12.2016, 11:13 14
В целом, для этой схемы больше подошла бы агрегация.
Информация точно так же может включать в себя другую информацию, наследование тут очень сомнительное решение.
0
7 / 7 / 9
Регистрация: 22.10.2015
Сообщений: 74
16.12.2016, 11:15  [ТС] 15
Цитата Сообщение от JIawliet Посмотреть сообщение
Сообщение от DrOffset
Я думаю, имеется в виду, что это разная память (оперативная и on-board ram в видеокарте), соответственно объекты тоже должны быть разные.
наверно самое логичное объяснение
Должны быть... но сделать надо через наследование(
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
16.12.2016, 11:16 16
Цитата Сообщение от LoSyAsH Посмотреть сообщение
И на паре нас об этом тоже предупредили. Но реализовать надо...
Реализуй (думаю, очень редко когда задание можно оспорить - люди не любят признавать ошибки), но слово info верни на место, чтобы было как на схеме.

Добавлено через 36 секунд
Цитата Сообщение от LoSyAsH Посмотреть сообщение
Должны быть... но сделать надо через наследование(
Э, ты чего такое говоришь-то? Я как бы про наследование выше и говорил
Читай внимательнее.
0
7 / 7 / 9
Регистрация: 22.10.2015
Сообщений: 74
16.12.2016, 11:16  [ТС] 17
Цитата Сообщение от DrOffset Посмотреть сообщение
слово info верни на место, чтобы было как на схеме.
Хорошо
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
16.12.2016, 11:17 18
LoSyAsH, еще раз, в настройках среды где-то есть ключ. Надо его убрать. Приступай
Цитата Сообщение от DrOffset Посмотреть сообщение
где-то выставлен ключ -Werror, который заставляет компилятор трактовать предупреждения как ошибки.
0
7 / 7 / 9
Регистрация: 22.10.2015
Сообщений: 74
16.12.2016, 11:20  [ТС] 19
Цитата Сообщение от DrOffset Посмотреть сообщение
LoSyAsH, скорее всего где-то выставлен ключ -Werror, который заставляет компилятор трактовать предупреждения как ошибки.
Неоднозначность действительно будет (предупреждение совершено справедливо), нужно будет тебе подумать, как эту неоднозначность разрешать.
Попробую убрать этот ключ.

Цитата Сообщение от DrOffset Посмотреть сообщение
Э, ты чего такое говоришь-то? Я как бы про наследование выше и говорил
Читай внимательнее.
Цитата Сообщение от JIawliet Посмотреть сообщение
объекты тоже должны быть разные.
Я правильно понял, что ты имеешь ввиду, что у меня должен быть отдельный класс PC_RAM и VideoAdapter_RAM?
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
16.12.2016, 11:23 20
Цитата Сообщение от LoSyAsH Посмотреть сообщение
Я правильно понял, что ты имеешь ввиду, что у меня должен быть отдельный класс PC_RAM и VideoAdapter_RAM?
ну вообще это было б логично, но так как у тебя на схеме ничего подобного не указано, то лучше оставить все так как есть) пусть это будет на совести преподавателя)
0
16.12.2016, 11:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2016, 11:23
Помогаю со студенческими работами здесь

Компиляция кода
пытался через консоль скачать следующий модуль &quot;pip install pyinstaller&quot; но выходит ошибки (на...

Компиляция кода
Как компилировать код в Python 3.7+?

Компиляция кода
Доброго времени суток. Имеется М-файл с кодом. Суть кода: читаем фото, пропускаем через фильтры, на...

Компиляция с++ кода на с#
Здравствуйте, такой вопрос: Есть код на с++, который пишется в текстбоксе. Мне нужно его...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru