Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2011, 15:54   #1
Angryant
Пользователь
 
Регистрация: 30.06.2011
Сообщений: 15
По умолчанию Проблема с множественным наследованием

Код:
#include "stdafx.h"



int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}
Код:
class Person
{
		private:
			int d,m,y;
			char n[20],sn[20],fn[20];
		public:
		Person();
		Person(const char n[],char sn[],char fn[], int d,int m, int y);
				void setN (const char Nm[]);			
				void setSn(const char Snm[]);
				void setFn (const char Fnm[]);	
				void setBd (const int day,int month,int year);
				char* getN();
				char* getSn ();
				char* getFn ();
				int getD();
				int getM();
				int getY();
};
Код:
#include "stdafx.h"
#include <cstring> 
#include "Person.h"

Person::Person()
{ 
  strcpy_s(this->n, sizeof(n),"");
  strcpy_s(this->sn, sizeof(sn),"");
  strcpy_s(this->fn, sizeof(fn),"");
  d=0;
  m=0;
  y=0;
}
Person::Person(const char nm[],char snm[],char fnm[], int day,int month, int year)
{
	strcpy_s(this->n, sizeof(this->n),nm);
	strcpy_s(this->sn, sizeof(this->sn),snm);
	strcpy_s(this->fn, sizeof(this->fn),fnm);
	this->d=day;
	this->m=month;
	this->y=year;
}

            void Person::setN (const char nm[])
                {strcpy_s(n,sizeof(n), nm);};
			void Person::setSn(const char snm[])
                {strcpy_s(sn,sizeof(sn), snm);};
			void Person::setFn (const char fnm[])
                {strcpy_s(fn,sizeof(fn), fnm);};
			void Person::setBd (const int day,int month,int year)
			{d=day; m=month; y=year;};
				char* Person::getN()
				{return(n);};
				char* Person::getSn ()
				{return(sn);};
				char* Person::getFn ()
				{return(fn);};
				int Person::getD()
				{return(d);};
				int Person::getM()
				{return(m);};
				int Person::getY()
				{return(y);};
Код:
class Address 
{		
private:
		char City[50];
		char Street[50];
		char Building[20];
		public:	
		Address();		
        Address(const char city[], char street[], char building[]);		
        Address(const Address& address);	
        void setCity (const char Ct[]);			
		void setStreet (const char St[]);
		void setBuilding (const char Bd[]);	
		char* getCity ();
		char* getStreet ();
		char* getBuilding ();
					       
};
Код:
#include "stdafx.h"
#include <cstring>  
#include "Address.h"
Address::Address()		
		{
			 strcpy_s(this->City, sizeof(City),"");
			 strcpy_s(this->Street, sizeof(Street),""); 
			 strcpy_s(this->Building, sizeof(Building),"");
		}
Address::Address(const char city[], char street[], char building[])		
	{
		strcpy_s(this->City, sizeof(this->City),city);
		strcpy_s(this->Street, sizeof(this->Street),street);
		strcpy_s(this->Building, sizeof(this->Building),building);
    }
Address::Address(const Address& address)		
		{
			this->setCity(address.City);
			this->setStreet(address.Street);
            this->setBuilding(address.Building);	
	    }
void Address::setCity (const char Ct[])			
	   {strcpy_s(City,sizeof(City), Ct);};
void Address::setStreet (const char St[])
	   {strcpy_s(Street,sizeof(Street), St);};
void Address::setBuilding (const char Bd[])	
	   {strcpy_s(Building,sizeof(Building), Bd);};
char* Address::getCity ()
	   {return (City);};
char* Address::getStreet ()
	   {return (Street);};
char* Address::getBuilding()
	   {return (Building);};
Код:
class Student:public Person , public Address
{
private:
	char gr[10];
    int kr;
   
public:
    Student();
	Student(const char nm[],char snm[],char fnm[], int day,int month, int year,const char gru[],int kurs);
	void setGr (const char gru[]);
	void setKr (int kurs);
	char* getGr ();
	int getKr();
};
Код:
#include "stdafx.h"
#include <cstring> 
#include "Person.h"
#include "Student.h"
#include "Address.h"

Student::Student()
{
		setN("");
		setSn("");
		setFn("");
		setBd(0,0,0);
		kr=0;
		strcpy_s(this->gr, sizeof(gr),"");
  
}

Student::Student(const char nm[],char snm[],char fnm[], int day,int month, int year,const char gru[],int kurs)
{
	setN(nm);
	setSn(snm);
	setFn(fnm);
    setBd(day,month,year);
    strcpy_s(this->gr, sizeof(gr),gru);
    setKr(kurs);
}
	void Student::setGr (const char gru[])
	{strcpy_s(gr,sizeof(gr),gru);};
	void Student::setKr (int kurs)
	{kr=kurs;};
	char* Student::getGr ()
	{return(gr);};
	int Student::getKr()
	{return(kr);};

g:\study\progr\тцу\labs\labs\studen t.h(2): error C2504: Address: не определен базовый класс
постоянно выбивает эту ошибку, всё вроде подключено и объявлено, разложено по хидерам и тд
Angryant вне форума Ответить с цитированием
Старый 25.12.2011, 16:22   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Рассмотрим единицу трансляции Student.cpp

По мере подключения модулей:

Код:
#include "stdafx.h"    //шняга
#include <cstring>    //шняга
#include "Person.h"    //Вот это важный момент! 
                              //Единица трансляции теперь знает тип данных Person

#include "Student.h"  //теперь подключается тип данных самого студента
                             //В котором объявляется тип данных Student
                             //Продукт двух классов....
Код:
class Student:public Person , public Address
Тип данных Address ещё не был подключен. И поэтому - не известен.
Каким образом прикажете компилятору догадаться, что это за Address такой, и с чем его едят?

Код:
#include "Address.h"  // только теперь становится известен тип Address
                             //но к этому моменту компилятор уже споткнулся

Последний раз редактировалось _Bers; 25.12.2011 в 16:44.
_Bers вне форума Ответить с цитированием
Старый 25.12.2011, 16:29   #3
Angryant
Пользователь
 
Регистрация: 30.06.2011
Сообщений: 15
По умолчанию

спасибо огромное) в голову не приходило что имеет значение порядок подключения директив
Angryant вне форума Ответить с цитированием
Старый 25.12.2011, 16:48   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Angryant Посмотреть сообщение
спасибо огромное) в голову не приходило что имеет значение порядок подключения директив
При грамотном подходе нужно выдержать только 2 правила:

1. Все, что нужно классу для работы должно быть подключено перед его объявлением (можно использовать технику forward declaration и поюзать указатели//ссылки, но эта тема достойна отдельного рассмотрения)

2. Все хэдэры под охраной стражников.


Тогда порядок включения директив станет почти-почти не важен)

У тебя 2й пункт отсутствует. Сдаётся мне, когда ты доберёшься до "много файлового" проекта, ты сразу прочувствуешь, что это такое, и зачем это нужно.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа с абстрактным базовым классом и множественным наследованием temask Visual C++ 0 21.12.2011 23:14
добавление ограничений по множественным условия выбора значений algeka Microsoft Office Excel 0 31.03.2011 14:55
Проблема с наследованием! Shepard90 Общие вопросы C/C++ 1 16.12.2010 18:46
Как добавить значения из списка с множественным выбором в таблицу/запрос? NickiBell Microsoft Office Access 0 24.09.2010 00:38
[Delphi]: Создание нового класса с наследованием Kolhan Помощь студентам 6 17.04.2009 00:03