Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
paladinama
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 21
#1

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

26.07.2013, 19:30. Просмотров 1346. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2013, 19:30     Родительский и дочерний класс
Посмотрите здесь:

Используя родительский класс C++
C++ ошибки с указателем на родительский класс
C++ базовый,дочерний , дружественная функция
Родительский класс неявно влияет на значение переменной наследника C++
C++ Передать параметр в дочерний процесс через execl()
Передача аргументов из родительского в дочерний процесс C++
C++ Родительский и дочерний процесс
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ovner
7 / 7 / 0
Регистрация: 06.10.2012
Сообщений: 140
26.07.2013, 19:46     Родительский и дочерний класс #2
У меня тоже такое было, помоему не хватает конструктора, попробуй напиши:
Base(){};
и во втором:
Children(){};
paladinama
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 21
26.07.2013, 19:52  [ТС]     Родительский и дочерний класс #3
Конструкторы есть, просто я их не писал. Попробовал поставить их в самый верх. Все равно эта же ошибка
Croessmah
Модератор
Эксперт CЭксперт С++
12887 / 7273 / 810
Регистрация: 27.09.2012
Сообщений: 17,973
Записей в блоге: 2
Завершенные тесты: 1
26.07.2013, 19:57     Родительский и дочерний класс #4
Forward declaration + include quards в помощь.
А вообще не понятно зачем в базовом информация о детях...
paladinama
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 21
26.07.2013, 20:24  [ТС]     Родительский и дочерний класс #5
Ну я не знаю как по другому сделать.
У меня есть класс Base и Children. В классе Base создаю обьект Children и вызываю функции из класса Children. В классе Children есть функция которая делает напрмер 100 раз одно и то же действие, и каждый раз должна обновлять список(выводится на экран). А список то в классе Base. И вот как мне вызвать функцию обновления списка зи класса Base.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 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 файлов!!!!
BigLow
55 / 55 / 2
Регистрация: 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
не проверял, но думаю должно правильно работать
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 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!
Это главное! Писать иерархию классов нужно от общего к частному. И каждый базовый класс должен быть "вещью в себе" и при появлении его потомков, в него не должны вноситься никакие изменения. ВООБЩЕ никакие!
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 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
BigLow
27.07.2013, 12:40
  #10

Не по теме:

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

C++
1
class Children;

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

Не по теме:

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

Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 1
27.07.2013, 12:58     Родительский и дочерний класс #15
Цитата Сообщение от Jupiter Посмотреть сообщение
хеллоувордщик детектед.
что за наезды? Ты вот не помнишь, а мне вот и не в своём коде, а очень даже в чужом коде всегда не лень посмотреть, какие конкретно зависимости нужны в срр файле.
Заголовки должны быть заголовками. И каждый раз делая инклюд нужно чётко представлять, как будет выглядеть итоговый срр файл после препроцессора.
Я уж не хочу повторять о том, что хранить в Base указатели на каких-то Children выглядит полным бредом.
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2013, 13:06     Родительский и дочерний класс #16

Не по теме:

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



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

Не по теме:

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



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

Не по теме:

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

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?
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 1
27.07.2013, 15:25     Родительский и дочерний класс #18
Я ещё раз обращаю твоё внимание на неверную иерархию классов.
Наследование означает, что каждый экземпляр класса Children будет являться ещё и экземпляром базового.
То есть каждому из детей можно будет сделать UpdateList.
Ты уверен, что тебе это нужно?
Вообще говоря, наследование не следует использовать вместо агрегации, если его возможно ею заменить!

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

Я нажимаю например кнопку на форме. Вызывается функция загрузки из класса Downloader. Эта функция делает n-oe количество одинаковых действий и после каждого действие она должна обновить список на форме. И вот как по нормальному сделать я хз. Я же рак в с++=)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2013, 16:11     Родительский и дочерний класс
Еще ссылки по теме:

C++ Простое наследование в с++. Базовый класс (AEROFLOT) и дочерний (REIS)
C++ Передача объекта-наследника по r-value ссылке на родительский класс
Родительский класс "Геометрическая фигура", потомок "Конус" C++
Обязан ли дочерний класс реализовать все виртуальные функции отца? C++
C++ Передача значения переменной из родительского класса в дочерний

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2013, 16:11     Родительский и дочерний класс #20
paladinama, гуглите callback
Yandex
Объявления
27.07.2013, 16:11     Родительский и дочерний класс
Ответ Создать тему
Опции темы

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