Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Помогите, плиз, вынести классы в отдельные файлы.

Ответить
Настройки темы
C/C++ - [решено] Помогите, плиз, вынести классы в отдельные файлы.

Аватара для Oleg_SK

Ветеран


Сообщения: 1328
Благодарности: 144


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: Oleg_SK
Дата: 05-06-2010
Сабж. Сейчас программа выглядит так:

Код: Выделить весь код
//virtual.h

class One
{
public:
	One(){};
	virtual ~One();
	virtual void TellMe()=0;
protected:
	
private:
	
};

class Two: public One
{
public:
	~Two();
	virtual void TellMe();
protected:

private:

};

class Three: public One
{
public:
	~Three();
	
protected:
	virtual void TellMe();

private:

};
Код: Выделить весь код
//virtual.cpp

#include "stdafx.h"
#include <iostream>
#include "virtual.h"

using namespace std;

One::~One()
{
	cout << "!!!" << endl;
}

Two::~Two()
{
	cout << "Two::destructor" << endl;
}

void Two::TellMe()
{
	cout << "Two::TellMe" << endl;
}

Three::~Three()
{
	cout << "Three::destructor" << endl;
}

void Three::TellMe()
{
	cout << "Three::TellMe" << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	const int size=10;
	One* arrey[size];
	for(int i=0; i<size; i+=2)
	{
		arrey[i]=new Two;
		arrey[i+1]=new Three;
	}

	Three* temp;
	for(int i=0; i<size; ++i)
	{
		
		//temp = dynamic_cast<Three*>(arrey[i]);
		//if(temp!=NULL)
		//{
		//	cout << "Three object...\n";
		//	temp->TellMe();
		//}

		arrey[i]->TellMe();
	}
	
	cout << endl;

	for(int i=0; i<size; ++i)
	{
		delete arrey[i];
	}

	cout << endl;
	
	int y;
	cin >> y;
	return 0;
}
Хочу выделить классы в отдельные файлы, но что-то не получается (лезут непонятные ошибки)... Делаю так:

Код: Выделить весь код
//One.h

class One
{
public:
	One(){};
	virtual ~One();
	virtual void TellMe()=0;
protected:
	
private:
	
};
Код: Выделить весь код
//One.cpp

#include <iostream>
#include "One.h"

using namespace std;

One::~One()
{
	cout << "!!!" << endl;
}
Код: Выделить весь код
//Two.h

#include "One.h"

class Two: public One
{
public:
	~Two();
	virtual void TellMe();
protected:

private:

};
Код: Выделить весь код
//Two.cpp

#include <iostream>
#include "Two.h"

using namespace std;

Two::~Two()
{
	cout << "Two::destructor" << endl;
}

void Two::TellMe()
{
	cout << "Two::TellMe" << endl;
}
Код: Выделить весь код
//Three.h

#include "One.h"

class Three: public One
{
public:
	~Three();
	virtual void TellMe();
	
protected:

private:

};
Код: Выделить весь код
//Three.cpp

#include <iostream>
#include "Three.h"

using namespace std;

Three::~Three()
{
	cout << "Three::destructor" << endl;
}

void Three::TellMe()
{
	cout << "Three::TellMe" << endl;
}
Код: Выделить весь код
//virtual.cpp

#include "stdafx.h"
#include <iostream>
#include "One.h"
#include "Two.h"
#include "Three.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	const int size=10;
	One* arrey[size];
	for(int i=0; i<size; i+=2)
	{
		arrey[i]=new Two;
		arrey[i+1]=new Three;
	}

	//Three* temp;
	for(int i=0; i<size; ++i)
	{
		//(dynamic_cast<Three*>(arrey[i]))->TellMe();

		//temp = dynamic_cast<Three*>(arrey[i]);
		//if(temp!=NULL)
		//{
		//	cout << "Three object...\n";
		//	temp->TellMe();
		//}
		arrey[i]->TellMe();
	}

	//Three test;
	//test.TellMe();

	cout << endl;

	for(int i=0; i<size; ++i)
	{
		delete arrey[i];
	}

	cout << endl;

	int y;
	cin >> y;
	return 0;
}
Хотелось бы узнать: что я делаю не так?

P.S: Использую Visual Studio 2010.

-------
Здесь вместо "Спасибо" принято щелкать на "Полезное сообщение" у тех постов, которые вам помогли, или показались полезными.


Отправлено: 13:52, 05-06-2010

 

Аватара для Oleg_SK

Ветеран


Сообщения: 1328
Благодарности: 144

Профиль | Отправить PM | Цитировать


Проблема решена. Для этого потребовалось сделать следующее:
1) В файлах Two.h и Three.h заменил инклюд файла One.h на объявление: class One;
2) Учел особенности работы Visual Studio; проинклюдил все свои заголовочные файлы и файл iostream в файле stdafx.h, а из своих cpp-файлов эти инклюды убрал, заменив на инклюд stdafx.h.

-------
Здесь вместо "Спасибо" принято щелкать на "Полезное сообщение" у тех постов, которые вам помогли, или показались полезными.


Отправлено: 17:26, 05-06-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


ещё бы хотелось узнать какие именно ошибки лезут. Если о том, что классы уже определены, то:
сборка программы на с/с++ состоит из 3х этапов:
1. препроцессинг,
2. комлиляция
3. связывание (linking).
На певом этапе:
1. весь текст собираемого модуля сливается в один файл (#include) в одну строчку
2. выполняются директивы препроцессора по замене текста #define
3. удаляются комментарии
4. раскрываются так называемые триграфы
5. соединяются строчные константы, разделённые пробелами "sd\nfds" "123" -> "sd<код символа \n>fds123"

допустим есть 3 файла:
Код: Выделить весь код
1.h:
int a;

2.h:
#include "1.h"
int b;

3.cpp:
#include "1.h"
#include "2.h"
после препроцессинга 3.cpp вместо #include будет содержимое указанных файлов, т.е.
Код: Выделить весь код
int a;
int a;
int b;
такой код не проглотится компилятором, потому что переопределяется переменная a. Чтобы не было таких подвохов, используют хитрость:
Код: Выделить весь код
1.h:
#ifndef 1_H
#define 1_H
int a;
#endif
теперь после первого включения 1.h препроцессор запомнит значение 1_H и (следуя инструкции #ifndef) будет в следующий раз пропускать содержимое этого файла.
Сделай то же самое, и у тебя заработает
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:38, 05-06-2010 | #3


Аватара для Oleg_SK

Ветеран


Сообщения: 1328
Благодарности: 144

Профиль | Отправить PM | Цитировать


pva
Цитата:
#ifndef 1_H
#define 1_H
int a;
#endif
Благодарю за информацию. На данный момент, я проинклюдил все свои заголовочные файлы в файле stdafx.h, в котором первой же инструкцией идет #pragma once, которая AFAIK служит для того-же, что и эта конструкция- исключает повторный инклюд файла.

-------
Здесь вместо "Спасибо" принято щелкать на "Полезное сообщение" у тех постов, которые вам помогли, или показались полезными.


Отправлено: 18:11, 05-06-2010 | #4


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


pva, Красиво объяснил. Я так писал всегда, просто потому что в книге написано было именно так и без пояснений почему так.
Цитата pva:
1.h:
#ifndef 1_H
#define 1_H
int a;
#endif »

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 18:15, 05-06-2010 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Помогите, плиз, вынести классы в отдельные файлы.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Помогите плиз!!!! rum777 Программирование в *nix 1 04-05-2009 12:35
Помогите плиз Paagrio Мобильные ОС, смартфоны и планшеты 2 01-05-2008 20:27
помогите плиз tair Непонятные проблемы с Железом 17 08-02-2006 15:53
Установленный c нуля WinME (engl) не читает прежние русские файлы. Хелп, плиз ab Microsoft Windows 95/98/Me (архив) 16 10-05-2005 23:35
Помогите плиз! MelouN Вебмастеру 2 06-10-2003 14:48




 
Переход