Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269

Наследование переменных класса

05.11.2019, 22:02. Показов 6681. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Имею класс P1 с некоторыми переменными. В ходе работы программы эти переменные задаются значениями. Второй класс должен их унаследовать и использовать в своих методах.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class P1
{
public:
    string var;
    vector<double> left;
    vector<int> right;
}
 
class P2 :
    public P1
{
public:
void display();
 
void display(){
cout <<left.size()<<endl;
}
Однако при обращении к этим переменным, они почему-то не наследуются (имеют значения 0). Не понимаю, в чём дело
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.11.2019, 22:02
Ответы с готовыми решениями:

ООП. Наследование переменных и методов от Базового класса к Дочернему и наоборот
class Money : { public: int Selection() { //Здесь играет роль SumToGrn(double &amp;Sum) которую текущий базовый класс не видит. ...

Наследование: Как мне определить любой из методов заданного класса внутри другого класса?
Добрый день, подскажите пожалуйста, что я делаю не так Есть файл Container.h в котором храню прототипы методов class Container ...

Наследование переменных от интерфейса
Задача на засыпку Почему так работает template &lt;class T&gt; class A { public: A():a(19),b(&amp;a){}; virtual void get()=0; ...

19
фрилансер
 Аватар для Алексей1153
6451 / 5652 / 1129
Регистрация: 11.10.2019
Сообщений: 15,053
05.11.2019, 22:06
SoBadDay, код то покажи
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
05.11.2019, 22:14  [ТС]
Даже не знаю, как правильно это сделать, ведь он довольно большой. Думаю, для начала покажу код одной функции, а к остальным могу применить данные мне советы.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class P1
{
public:
    string var;
    vector<double> left;
    vector<int> right;
      double
        variant,
        q,
        P,
        r;
       void set_var(int i_var);
}
 
void P1::set_var(int input) {
    var = "Var" + to_string(input) + ".txt";
    ifstream file(var);
    double l, r;
    while (file >> l >> r) {
        left.push_back(l);
        right.push_back(r);
    }
    q = input / 100.0;
    P = 1 - q;
    r = left.size() - 1;
    variant = input;
}
 
class P2 :
    public P1
{
public:
    double h2;
}
 
void P2::set_h2() {
    MatrixXd e(left.size(), 1); 
    MatrixXd h(left.size(), 1);
    for (int i = 0; i < left.size(); ++i) {
        e(i, 0) = 1;         
        h(i, 0) = left[i];
    }
    MatrixXd P(left.size(), left.size());
    for (int i = 0; i < left.size(); ++i)
        for (int j = 0; j < left.size(); ++j)
            if (i == j)
                P(j, i) = 1.0 / right[i];
            else
                P(j, i) = 0;
    auto f1 = e.transpose() * P * h;
    auto f2 = e.transpose() * P * e;
    h2 = f1(0, 0) / f2(0, 0);
}
 
int main() {
    setlocale(LC_CTYPE, "RUS");
    cout << "Введите Ваш вариант" << endl;
    int v;
    cin >> v;
    P1* obj1 = new P1();
    obj1->set_var(v);
    obj1->start();
    P2* obj2 = new P2();
    obj2->start();
    delete obj1;
    delete obj2;
Функция
C++
1
start()
вызывает все функции класса.
C++
1
2
3
4
5
void P1::start() {
    set_average_h();
        //все остальные функции
        output()
}
Функция
C++
1
output()
содержит в себе большое количество
Code
1
cout<<"Переменная = "<<numb<<endl;
для вывода значений переменных на экран
0
фрилансер
 Аватар для Алексей1153
6451 / 5652 / 1129
Регистрация: 11.10.2019
Сообщений: 15,053
05.11.2019, 22:20
SoBadDay,

C++
1
2
3
4
5
6
    P1* obj1 = new P1();//создали obj1
    obj1->set_var(v);//что-то заполнили
    obj1->start();//вывели
 
    P2* obj2 = new P2();//создали obj2
    obj2->start();//вывели нули
вроде всё так ?
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
05.11.2019, 22:23  [ТС]
Алексей1153, не совсем.
В целом принцип программы Вы поняли. Создали объект 1, запустили все функции. Создали объект 2, запустили все функции( они используют переменные объекта 1). Однако при выводе переменных объекта 2, компилятор выдаёт их, как
Code
1
h2 = -nan(ind)
При отладке я увидел, что вектора left и right в функциях объекта 2 имеют размерность 0, причину чего я и пытаюсь выяснить
0
фрилансер
 Аватар для Алексей1153
6451 / 5652 / 1129
Регистрация: 11.10.2019
Сообщений: 15,053
05.11.2019, 22:27
Цитата Сообщение от SoBadDay Посмотреть сообщение
они используют переменные объекта 1
это с чего же? У второго объекта своя память

Добавлено через 1 минуту
Цитата Сообщение от SoBadDay Посмотреть сообщение
вектора left и right в функциях объекта 2 имеют размерность 0
заполни их тоже
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
05.11.2019, 22:29  [ТС]
Алексей1153,
это с чего же? У второго объекта своя память
Именно это я и пытаюсь выяснить. При наследовании класса не передаются значения его переменных? Возможно ли это реализовать?
0
фрилансер
 Аватар для Алексей1153
6451 / 5652 / 1129
Регистрация: 11.10.2019
Сообщений: 15,053
05.11.2019, 22:35
Цитата Сообщение от SoBadDay Посмотреть сообщение
При наследовании класса не передаются значения его переменных
класс - это метаданные, чертёж будущего реального объекта в озу. Создал два объекта (одного класса или разных) - они каждый имеют свой индивидуальный адрес в озу, не пересекаются
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
05.11.2019, 22:40  [ТС]
Алексей1153,
Однако переменных,значения которых мне нужно заимствовать, больше десятка. Определяются они не 1 строчкой кода. Например, вектора left и right содержат в себе по 100+ значений. Мне видится повторное их определение нерациональным. Неужели нет выхода из этой ситуации?
0
фрилансер
 Аватар для Алексей1153
6451 / 5652 / 1129
Регистрация: 11.10.2019
Сообщений: 15,053
05.11.2019, 22:42
SoBadDay, что значит заимствовать ? Если речь про инициализацию, то для этого есть конструктор и копирование
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,213
05.11.2019, 23:05
Цитата Сообщение от SoBadDay Посмотреть сообщение
При наследовании класса не передаются значения его переменных?
У класса нет никаких переменных. Переменные есть только у индивидуальных объектов этого класса. У каждого объекта - свои отдельные переменные.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.11.2019, 23:56
Цитата Сообщение от SoBadDay Посмотреть сообщение
Однако переменных,значения которых мне нужно заимствовать, больше десятка. Определяются они не 1 строчкой кода. Например, вектора left и right содержат в себе по 100+ значений. Мне видится повторное их определение нерациональным. Неужели нет выхода из этой ситуации?
Класс это тип, а объект класса - "переменная". Вы же не можете потребовать от типа int явязь с каким-то значением разделяемым группой переменных.
Если вам нужно такое поведения (и если я правильно это понял), то наследование не нужно. Достаточно создать объект и пользоваться ссылками на него. У всех будут одни и те же значения. А публичное наследование, обычно, применяется для наследования поведения. Методы базового класса - интерфейс наследников с которым они выглядят сходными по функционалу. На чём и наживаются ушлые программеры.
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
06.11.2019, 13:50  [ТС]
IGPIGP,
Цитата Сообщение от IGPIGP Посмотреть сообщение
Достаточно создать объект и пользоваться ссылками на него.
Если не сложно, приведите пример данной реализации
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.11.2019, 15:01
Цитата Сообщение от SoBadDay Посмотреть сообщение
Если не сложно, приведите пример данной реализации
SoBadDay, Нужно точно знать задачу чтобы понять что следует сделать. При работе со ссылками на один и тот же объект возникает ряд вопросов. Один из коренных, - как организовать владение разделяемым объектом. Следующий, какие классы имеют какой доступ (разделение доступа). Например, одни могут быть друзьями и делать что вздумается. Это для разраба и его интеллект определяет разумность данного решения. Другие , могут иметь ссылки и, следовательно - иметь доступ к публичным полям. А третьи имея константные ссылки могут лишь читать публичные данные. В любом случае, это обычно признак нездоровой логики. Одна из целей ООП - разделение (чтобы властвовать)) ). Это значит, что группировка данных и функций-членов в классы подразумевает персонализацию на уровне типа, ответственности за доступ, время жизни, целостность данных и алгоритмы их обработки. Желание это брутально нарушить должно быть хорошо обоснованно.
SoBadDay, у меня есть сильное подозрение, что формулировка задачи на уровне решаемого алгоритма лучше чем чем формулировка на уровне реализации зависимостей и отношений в уже выбранном решении (наследования группы данных для различного использования одного и того же набора(!!)). Расскажите лучше, что хотите делать.
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
07.11.2019, 08:53  [ТС]
IGPIGP,
Цитата Сообщение от IGPIGP Посмотреть сообщение
Расскажите лучше, что хотите делать.
Рассказываю, что хочу сделать. Есть класс P1, который содержит в себе исходные данные задачи, а также остальные переменные, связанные с ними. Есть ещё два класса P2 и P3, у которых свои переменные, которым для инициализации нужны переменные класса P1. По сути, ничего изменять вне класса P1 не нужно - все необходимые действия над переменными произведены внутри него. Остальные классы лишь используют полученные этим классом переменные в своих целях(инициализации своих переменных), изменять их не нужно.

Например.
Класс P1 содержит в себе переменную 'a' и функцию её инициализации. Класс P2 содержит в себе переменную 'b', и функцию её инициализации "5+a".
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.11.2019, 10:31
SoBadDay, инициализация 9неразрущающая/не переиещающая) это по сути копирование. Что мешает вам передавать объект класса P1 по константной ссылке всем кто хочет от него зачать?
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
07.11.2019, 21:03  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Что мешает вам передавать объект класса P1 по константной ссылке
Я всё это время пытаюсь у Вас спросить, как это сделать. Не хватает знаний языка, к сожалению
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.11.2019, 21:09
Цитата Сообщение от SoBadDay Посмотреть сообщение
Я всё это время пытаюсь у Вас спросить, как это сделать. Не хватает знаний языка, к сожалению
Есля я пойму, что вы хотите, возможно, смогу сказать как я бы это сделал. Вы объяснили в общих выражениях и я ответил в общих выражениях. Это логично. Советую прочесть "Ответчик" Р. Шекли. Если честно, я бы в правилах форума написал:
Всем обязательно прочесть "Ответчик" Р. Шекли перед регистрацией. Иначе учётная запись будет гореть в аду!
Попробуйте создать неймспейсик в котором определите горсть переменных и покажите как вы будете их использовать. Это самый простой путь к ООП у людей измученных глобальными переменными. Видя хоть какой-то фрагмент кода будет легче что-то подсказать. Хотя может оказаться, что вам пока этого будет достаточно, кстати.
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
07.11.2019, 21:22  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вы объяснили в общих выражениях и я ответил в общих выражениях.
Пример кода я сбрасывал выше в теме.

Если код не понятен, поясню.
Есть вектор left, который заполняется внутри одного из методов класса P1. Позже, класс P2 использует этот вектор в для определения своих переменных.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.11.2019, 23:17
Лучший ответ Сообщение было отмечено SoBadDay как решение

Решение

SoBadDay, глядя на содеянное вами я вам не судья. Это по ту сторону добра и зла. Когда нибудь вы напишете конструктор для вашего класса, свободную функцию (типа фабрики) которая будет работать с файлом и векторами... или ещё как-то. А пока я могу вам посоветовать создать в классе P2 поле P1 m_p1; a в конструкторе P1 вызовите m_p1.set_var(input), соответственно, это целое - должно быть параметром конструктора. А к полям типа left обращайтесь через имя данного объекта P1.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.11.2019, 23:17
Помогаю со студенческими работами здесь

Наследование нескольких переменных
Имеются 3 класса (computer, pc, pda). pc должен наследовать от computer 2 переменных, а pda от pc его 2 переменных и те 2 что он наследует...

Наследование методов класса
Я пишу программу на наследование классов.Базовый - Person , с объектами имя , возраст , вес. Наследник - Student , с собственным объектом...

Наследование класса Устройство
У меня есть класс Устройство,мне нужно создать второй класc который наследует базовый,с этими же методами, но с дополнительными полями. ...

Наследование класса Exception
Доброе время суток, уважаемые профи, и знатоки! У меня появилась очень серьезная проблема, суть которой заключается в наследовании класа...

Наследование класса Вектор
Помогите написать прогу плииззз.... Разработать класс NormVector – вектор единичной длины, наследованный от класса Vector. Замечание:...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru