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

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

Войти
Регистрация
Восстановить пароль
 
Dkan
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 31
#1

Наследование - C++

30.10.2011, 18:11. Просмотров 698. Ответов 5
Метки нет (Все метки)

Создаю базовый класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <string>
 
using namespace std ;
 
class T
{
protected:
    string name ;
public:
    T( string ) ;
    void print() ;
};
Наследую о него другой класс(классы расположены в разных .h файлах):
C++
1
2
3
4
5
6
7
8
9
#include "T.h"
class C: public T
{
protected:
    int a ;
public:
    C( string, int ) ;
    void print() ;
};
Возникают 2 ошибки:
1) В файле T.h - 'class' type redefinition ;
2) В файле C.h - base class undefined.

Как исправить эти ошибки?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2011, 18:11     Наследование
Посмотрите здесь:

Наследование в C++ - C++
Прошу помощи, ибо С++ не моё, а лабораторные работы девушке сдавать надо: Создать 1 базовый класс и несколько производных. Все...

Наследование - C++
Написал код, но есть небольшая ошибка. Мне нужно, чтобы с клавиатуры вводилось имя (например James) и он сразу выводил по нему всю...

Наследование - C++
Как избавиться от неоднозначности при ромбовом наследовании?

Наследование c++ - C++
Здравствуйте. Есть абстрактный класс : class GeometryFigures { private: string Name; public: void setName(string Name_new);...

Наследование в с++ - C++
Люди добрые, помогите пожалуйста. Нужно срочно сдать программу по теме &quot;Наследование&quot;, но че-то не могу написать. Наследование только...

Наследование - C++
15. Описать производный класс, содержащий поле козырь, и функцию, проверяющую кроет ли карта, указанную в качестве параметра другую карту ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
30.10.2011, 18:17     Наследование #2
Цитата Сообщение от Dkan Посмотреть сообщение
Создаю базовый класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <string>
 
using namespace std ;
 
class T
{
protected:
    string name ;
public:
    T( string ) ;
    void print() ;
};
Наследую о него другой класс(классы расположены в разных .h файлах):
C++
1
2
3
4
5
6
7
8
9
#include "T.h"
class C: public T
{
protected:
    int a ;
public:
    C( string, int ) ;
    void print() ;
};
Возникают 2 ошибки:
1) В файле T.h - 'class' type redefinition ;
2) В файле C.h - base class undefined.

Как исправить эти ошибки?
В том коде, который вы привели, никакого переопределения класса T не видно. Надо внимательно читать сообщение об ошибке, так как оно обычно содержит ссылку на тот класс, который, якобы, переопределяется.

Проблема скорей всего заключается в том,что вы эти два заголовка включаете в модуль с main, и поэтому заголовок T.h у вас включается дважды. Нужно вставитьстандартнуюзащиту от включенияз аголовока дважды, посредством объявления манифестной константны.
Dkan
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 31
30.10.2011, 18:23  [ТС]     Наследование #3
Если не было бы не писал)

Error 1 error C2011: 'T' : 'class' type redefinition c:\...\T.h 6
Error 2 error C2504: 'T' : base class undefined c:\...\C.h 3

Указывает на символ { в каждом классе.

Добавлено через 58 секунд
Это как?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.10.2011, 18:27     Наследование #4
Dkan, Стражи включения в каждый хедер внесите.

C++
1
2
3
4
#ifndef __FILENAME_H__
#define __FILENAME_H__
//Между директивами будет ваш код.
#endif
Вместо __FILENAME_H__ соответственно название вашего хедера.
Сыроежка
Заблокирован
30.10.2011, 18:53     Наследование #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Dkan, Стражи включения в каждый хедер внесите.

C++
1
2
3
4
#ifndef __FILENAME_H__
#define __FILENAME_H__
//Между директивами будет ваш код.
#endif
Вместо __FILENAME_H__ соответственно название вашего хедера.

И только не надо вначале ставить подчеркивание у ьанифестных констант, так как подчеркивание зарезервировано разработчиками компиляторов и самого стандарта языка С++ для своих нужд. То есть не следует объявлять идентификаторы, начинающиеся с подчеркивания.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2011, 20:23     Наследование
Еще ссылки по теме:

наследование - C++
Помогите разобраться в программе. Почему возникают такие ошибки cylindr.cpp expected `,' or `...' before '&amp;' token cylindr.cpp `c'...

Наследование - C++
Доброе дня, прошу вас помочь в решение данной задачи.

Наследование - C++
Четыре класса наследуются друг от друга. Интересует какое в дальнейшем отношение имеют к базовому классу унаследованные члены в производных...

Наследование - C++
На основе класса «Массив» создать производный класс «Ассоциативный массив». Данный класс содержит массив указателей, каждый из которых...

Наследование - C++
Используя механизм наследования реализовать иерархию: Окружность –&gt; Цилиндр. У базового класса присутствуют методы: конструктор, вычисление...

Наследование - C++
Используя механизм наследования реализовать иерархию: фигура-&gt;круг ..........-&gt;треугольник ...


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

Или воспользуйтесь поиском по форуму:
Dkan
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 31
30.10.2011, 20:23  [ТС]     Наследование #6
И еще вопрос: вызывается ли конструктор базового класса если его явно не вызывать?

В этом случае вызываем явно.
C++
1
2
3
4
5
6
7
8
9
Base( string n )
{
n = name ;
}
 
Inh( string n, int x ):Base(n)
{
y = x ;
}
А в этом?

C++
1
2
3
4
5
6
7
8
9
Base( )
{
name = "name" ;
}
 
Inh( int x )
{
y = x ;
}
При создании объекта класса Inh будет ли неявно вызван конструктор класса Base?
Yandex
Объявления
30.10.2011, 20:23     Наследование
Ответ Создать тему
Опции темы

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