Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
paladinama
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 21
1

Родительский и дочерний класс

26.07.2013, 19:30. Просмотров 1691. Ответов 20
Метки нет (Все метки)

Всем доброго времени суток. Возникла проблема;
C++
1
2
3
4
5
//file Base.h
#include "Children.h"
class Base {
public: Children* a;
}
C++
1
2
3
4
5
//file Children.h
#include "Base.h"
class Children: public Base {
...
}
Пишет: 'Children' does not name a type
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2013, 19:30
Ответы с готовыми решениями:

Родительский и дочерний процесс
Для начала код. ProcessA#include <windows.h> #include <iostream> #include...

Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число"
Ткма работы создать класс pair (пара чисел); определить метод перемножения...

Указатель на дочерний класс
Доброго времени суток! Есть класс TSpisok в нём должны быть поля указатели на...

Используя родительский класс
Используя родительский класс «РАБОЧИЙ» породить производный класс «ДИРЕКТОР»....

ошибки с указателем на родительский класс
задание: сделать 3 класса: список, стек(списком), очередь(списком). Методы:...

20
ovner
7 / 7 / 5
Регистрация: 06.10.2012
Сообщений: 140
26.07.2013, 19:46 2
У меня тоже такое было, помоему не хватает конструктора, попробуй напиши:
Base(){};
и во втором:
Children(){};
0
paladinama
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 21
26.07.2013, 19:52  [ТС] 3
Конструкторы есть, просто я их не писал. Попробовал поставить их в самый верх. Все равно эта же ошибка
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
26.07.2013, 19:57 4
Forward declaration + include quards в помощь.
А вообще не понятно зачем в базовом информация о детях...
0
paladinama
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 21
26.07.2013, 20:24  [ТС] 5
Ну я не знаю как по другому сделать.
У меня есть класс Base и Children. В классе Base создаю обьект Children и вызываю функции из класса Children. В классе Children есть функция которая делает напрмер 100 раз одно и то же действие, и каждый раз должна обновлять список(выводится на экран). А список то в классе Base. И вот как мне вызвать функцию обновления списка зи класса Base.
0
Kuzia domovenok
2338 / 2079 / 488
Регистрация: 25.03.2012
Сообщений: 7,447
Записей в блоге: 1
27.07.2013, 12:21 6
Цитата Сообщение от ovner Посмотреть сообщение
У меня тоже такое было, помоему не хватает конструктора, попробуй напиши:
Base(){};
и во втором:
Children(){};
бред
Цитата Сообщение от paladinama Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
//file Base.h
#include "Children.h"
class Base {
public: Children* a;
} 
 
//file Children.h
#include "Base.h"
class Children: public Base {
...
}
А теперь ещё раз подумай, зачем тебе это надо. Скорее всего этого вообще не должно быть.

Ну а в качестве временной меры убери все инклуды из *.h файлов!!!!
0
BigLow
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
27.07.2013, 12:32 7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А теперь ещё раз подумай, зачем тебе это надо.
ну а если ТС все таки это нужно, то можно таким способом сделать):
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
// base.h
#ifndef BASE_H
#define BASE_H
#include "Children.h"
 
class Base;
 
class Base {
public: Children* a;
};
 
#endif
 
 
 
//file Children.h
#ifndef CHILDREN_H
#define CHILDREN_H
#include "Base.h"
 
class Children: public Base {
...
};
 
#endif
не проверял, но думаю должно правильно работать
0
Kuzia domovenok
2338 / 2079 / 488
Регистрация: 25.03.2012
Сообщений: 7,447
Записей в блоге: 1
27.07.2013, 12:36 8
Цитата Сообщение от BigLow Посмотреть сообщение
ну а если ТС все таки это нужно, то можно таким способом сделать):
ерунда. нужно вообще избегать взаимного инклюда заголовков. А уж взаимное включение уж точно нужно убрать!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// base.h
#ifndef BASE_H
#define BASE_H
 
class Base;
 
class Base {
public: Children* a;
};
 
#endif
 
 
 
//file Children.h
#ifndef CHILDREN_H
#define CHILDREN_H
 
class Children: public Base {
...
};
 
#endif
Но ещё раз повторю: одна из основ ООП - класс Base должен проектироваться так, что он ничего не знает о Children!
Это главное! Писать иерархию классов нужно от общего к частному. И каждый базовый класс должен быть "вещью в себе" и при появлении его потомков, в него не должны вноситься никакие изменения. ВООБЩЕ никакие!
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2013, 12:39 9
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
// base.h
#ifndef BASE_H
#define BASE_H
 
class Children;
 
class Base {
public: 
    Children* a;
};
 
#endif
 
//file Children.h
#ifndef CHILDREN_H
#define CHILDREN_H
 
#include "Base.h"
 
class Children: public Base {
...
};
 
#endif
0
BigLow
27.07.2013, 12:40
  #10

Не по теме:

Почему нельзя редактировать свои сообщения? Сейчас нашел ошибку у себя в 6 строчке. И не могу исправить

C++
1
class Children;

0
Kuzia domovenok
2338 / 2079 / 488
Регистрация: 25.03.2012
Сообщений: 7,447
Записей в блоге: 1
27.07.2013, 12:42 11
Цитата Сообщение от Jupiter Посмотреть сообщение
#include "Base.h"
повторю: взаимные инклюды заголовков не нужны!
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2013, 12:44 12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
повторю: взаимные инклюды заголовков не нужны!
взаимных инклудов там нет.
этот иклуд нужен.
иначе надо будет учитывать порядок инклудов в файле с исходниками выстрелить себе в ногу
0
Kuzia domovenok
2338 / 2079 / 488
Регистрация: 25.03.2012
Сообщений: 7,447
Записей в блоге: 1
27.07.2013, 12:50 13
Цитата Сообщение от Jupiter Посмотреть сообщение
иначе надо будет учитывать порядок инклудов в файле с исходниками выстрелить себе в ногу
именно это и надо делать, а не так, чтобы один инклюд засорял срр файл ещё несколькими килобайтами зависимых инклюдов
0
Jupiter
27.07.2013, 12:51
  #14

Не по теме:

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

0
Kuzia domovenok
2338 / 2079 / 488
Регистрация: 25.03.2012
Сообщений: 7,447
Записей в блоге: 1
27.07.2013, 12:58 15
Цитата Сообщение от Jupiter Посмотреть сообщение
хеллоувордщик детектед.
что за наезды? Ты вот не помнишь, а мне вот и не в своём коде, а очень даже в чужом коде всегда не лень посмотреть, какие конкретно зависимости нужны в срр файле.
Заголовки должны быть заголовками. И каждый раз делая инклюд нужно чётко представлять, как будет выглядеть итоговый срр файл после препроцессора.
Я уж не хочу повторять о том, что хранить в Base указатели на каких-то Children выглядит полным бредом.
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2013, 13:06 16

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
что за наезды? Ты вот не помнишь, а мне вот и не в своём коде, а очень даже в чужом коде всегда не лень посмотреть, какие конкретно зависимости нужны в срр файле.
такая куйня никому не нужна в продакшн коде



Добавлено через 20 секунд

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Я уж не хочу повторять о том, что хранить в Base указатели на каких-то Children выглядит полным бредом.
с этим согласен



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

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Заголовки должны быть заголовками. И каждый раз делая инклюд нужно чётко представлять, как будет выглядеть итоговый срр файл после препроцессора.
а теперь представь себе это на уровне проекта типа ГНУ/Линукс...а ну ты ж не уважаешь линукс...
ну тогда представь себе это на уровне вебкита или vlc или любой другой популярной программы/двигла/чего-угодно, где количество строк кода исчисляется миллионами.
иначе как хеллоувордным такой подход назвать нельзя, без обид.

0
paladinama
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 21
27.07.2013, 15:05  [ТС] 17
Ну теперь работает, только появилась другая проблема;
Кликните здесь для просмотра всего текста

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
// base.h
#ifndef BASE_H
#define BASE_H
 
class Children;
 
class Base {
public: 
    Children* a;
ListView* pList;
    void UpdateList(void);
 
};
 
#endif
 
//file Children.h
#ifndef CHILDREN_H
#define CHILDREN_H
 
#include "Base.h"
 
class Children: public Base {
void GO(void);
...
};
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
//file base.cpp
Base::Base() {}
Base::UpdateList(void) {
pList->Update();
}
...
//какятофункци {
pList = new ListView();
a->GO();
}
C++
1
2
3
4
5
//file Children.cpp
Children::GO(void) {
...
Base::UpdateList();
}


В общем крашится при попытке обновления. Насколько я понял Base::UpdateView() создает новый экземпляр класса Base?
0
Kuzia domovenok
2338 / 2079 / 488
Регистрация: 25.03.2012
Сообщений: 7,447
Записей в блоге: 1
27.07.2013, 15:25 18
Я ещё раз обращаю твоё внимание на неверную иерархию классов.
Наследование означает, что каждый экземпляр класса Children будет являться ещё и экземпляром базового.
То есть каждому из детей можно будет сделать UpdateList.
Ты уверен, что тебе это нужно?
Вообще говоря, наследование не следует использовать вместо агрегации, если его возможно ею заменить!

Короче, опиши подробно задачу и я скажу, почему тут не нужна такая конструкция!
0
paladinama
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 21
27.07.2013, 16:06  [ТС] 19
В общем так. Есть два класса( Form и Downloader). В Downloader все, что связано с загрузкой данной из нета, а Form собственно сама форма. В этой форме есть список.

Я нажимаю например кнопку на форме. Вызывается функция загрузки из класса Downloader. Эта функция делает n-oe количество одинаковых действий и после каждого действие она должна обновить список на форме. И вот как по нормальному сделать я хз. Я же рак в с++=)
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2013, 16:11 20
paladinama, гуглите callback
0
27.07.2013, 16:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2013, 16:11

Как передать 2 из 3-х значений конструктора в дочерний класс?
#include <iostream> #include <string> #include "math.h" using namespace std;...

Передача объекта-наследника по r-value ссылке на родительский класс
Здоровеньки булы. Собственно, код: class x { protected: int a; public:...

Простое наследование в с++. Базовый класс (AEROFLOT) и дочерний (REIS)
Есть два класса: базовый (AEROFLOT) и дочерний (REIS). При компиляции у меня...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru