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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2009, 01:20   #1
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию Классы(абстрактный и наследование)

вот пытался поработать с классами:
Код:
class stream
{
	public:
		volatile long getPos();
		volatile void setPos(long);
		volatile long seek(long,int);
		volatile long getSize();
		volatile void setSize(long int);
		volatile long read(void*,long);
		volatile long write(void*,long);
		volatile void readBuffer(void*,long);
		volatile void writeBuffer(void*,long);
		volatile int EoS();
		long copyFrom(stream* f,long int l);
};

class fileStream:stream
{
	private:
		char* buf;
		int bufSize;
	protected:
		FILE* f;
	public:
		long getPos();
		void setPos(long int);
		long seek(long,int);
		long getSize();
		void setSize(long);
		long read(char*,long);
		long write(char*,long);
		void readBuffer(void*,long);
		void writeBuffer(void*,long);
		int EoS();
		~fileStream();
		fileStream(char*,char*);
		long copyFrom(stream* f,long l);
};

long stream::copyFrom(stream* f,long l)
{
	long i;
	long C;
	char* c;
	long bufS;
	bufS=l;
	if(l>maxBuf)bufS=maxBuf;
	c=(char*)malloc(bufS);
	C=0;
	while(l!=0)
	{
		if(l>bufS)i=bufS;else i=l;
		i=f->read(c,i);
		write(c,i);
		l=l-i;
		C=C+i;
	}
	free(c);
	return C;
}//этого кода поидее достаточно
далее пытаюсь применить:
Код:
fileStream* rf=(fileStream*)new fileStream("C:\AddNode.pas");
fileStream* wf=(fileStream*)new fileStream("C:\AddNode1.pas");
wf->copyFrom(rf,rf->getSize());
в выделенной строке пишет:
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(167) : error
Цитата:
C2243: 'type cast' : conversion from 'class fileStream *' to 'class stream *' exists, but is inaccessible
среда MSVC++ 6.0

как же верно?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 31.10.2009 в 01:32.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.10.2009, 01:50   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Насчёт volatile, вероятно Вы имели ввиду virtual? )
Ещё что заметил - конструктор fileStream принимает два параметра char* в описании, а вызываете с одним.
Плюс в кавычках, чтобы отобразить символ '\' нужно писать так '\\'
"C:\\AddNode.pas", так как \ означает escape-последовательность в C/C++
По поводу ошибки - используйте приведение, или объявите наследование как public
В теме написано про абстрактные классы, но не увидел у Вас их здесь = )
Но в принципе, определяются они так:
Код:
class AbstractClass {
    virtual int method(int a, int b) = 0;
    virtual void show() = 0;
};

Последний раз редактировалось netrino; 31.10.2009 в 01:57. Причина: дополнил ответ )
netrino вне форума Ответить с цитированием
Старый 31.10.2009, 21:41   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

исправил как вы сказали...
ошибок стало только больше
Цитата:
--------------------Configuration: C1 - Win32 Debug--------------------
Compiling...
C1.cpp
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(165) : error C2259: 'fileStream' : cannot instantiate abstract class due to following members:
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(36) : see declaration of 'fileStream'
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(165) : warning C4259: 'long __thiscall stream::read(void *,long)' : pure virtual function was not defined
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(28) : see declaration of 'read'
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(165) : warning C4259: 'long __thiscall stream::write(void *,long)' : pure virtual function was not defined
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(29) : see declaration of 'write'
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(165) : error C2259: 'fileStream' : cannot instantiate abstract class due to following members:
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(36) : see declaration of 'fileStream'
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(165) : warning C4259: 'long __thiscall stream::read(void *,long)' : pure virtual function was not defined
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(28) : see declaration of 'read'
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(165) : warning C4259: 'long __thiscall stream::write(void *,long)' : pure virtual function was not defined
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(29) : see declaration of 'write'
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(166) : error C2259: 'fileStream' : cannot instantiate abstract class due to following members:
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(36) : see declaration of 'fileStream'
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(166) : warning C4259: 'long __thiscall stream::read(void *,long)' : pure virtual function was not defined
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(28) : see declaration of 'read'
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(166) : warning C4259: 'long __thiscall stream::write(void *,long)' : pure virtual function was not defined
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(29) : see declaration of 'write'
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(167) : error C2243: 'type cast' : conversion from 'class fileStream *' to 'class stream *' exists, but is inaccessible
Error executing cl.exe.

C1.obj - 4 error(s), 6 warning(s)
Код:
class stream
{
	public:
		virtual long getPos()=0;
		virtual void setPos(long)=0;
		virtual long seek(long,int)=0;
		virtual long getSize()=0;
		virtual void setSize(long int)=0;
		virtual long read(void*,long)=0;
		virtual long write(void*,long)=0;
		virtual void readBuffer(void*,long)=0;
		virtual void writeBuffer(void*,long)=0;
		virtual int EoS()=0;
		long copyFrom(stream* f,long int l);
};
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.10.2009, 22:35   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Компилятор говорит, что не может создать объект абстрактного класса )
Дело в том, что в производном классе необходимо описать реализацию всех методов абстрактного класса, при этом следует учесть, что разные типы параметров порождают разные перегруженные функции. Что и происходит в Вашем случае: класс stream имеет методы read и write первым параметром в которых есть тип void*, в то время, как наследуемый класс fileStream имеет методы с этими же именами, но с параметром типа char*. Приведите к единому виду и тогда будет компилироваться. Ещё одно, метод copyFrom у Вас объявлен и реализован в абстрактном, нет необходимости его ещё раз объявлять в производном классе, только если Вы не собираетесь придать ему иной функционал, но в таком случае в базовом классе лучше объявить этот метод как виртуальный

...

И кстати, если используются виртуальные функции, то деструктор лучше всего также объявить как виртуальный, даже если он будет пустой

Последний раз редактировалось netrino; 31.10.2009 в 22:40.
netrino вне форума Ответить с цитированием
Старый 01.11.2009, 23:44   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
По поводу ошибки - используйте приведение, или объявите наследование как public
можно поподробнее?
осталась две ошибки...
Цитата:
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(168) : error C2248: 'copyFrom' : cannot access public member declared in class 'stream'
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(33) : see declaration of 'copyFrom'
E:\Program Files\Microsoft Visual Studio\MyProjects\C1\C1.cpp(168) : error C2243: 'type cast' : conversion from 'class fileStream *' to 'class stream *' exists, but is inaccessible
Error executing cl.exe.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.11.2009, 01:13   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вот в таком виде у меня скомпилировалось )
Код:
#include <stdio.h>
#include <stdlib.h>

const int maxBuf = 1000;

class stream
{
	public:
		virtual long getPos() = 0;
		virtual void setPos(long) = 0;
		virtual long seek(long,int) = 0;
		virtual long getSize() = 0;
		virtual void setSize(long int) = 0;
		virtual long read(char*,long) = 0;
		virtual long write(char*,long) = 0;
		virtual void readBuffer(void*,long) = 0;
		virtual void writeBuffer(void*,long) = 0;
		virtual int EoS() = 0;
		long copyFrom(stream* f,long int l);

		virtual ~stream() { } // Желательно, чтобы деструктор был виртуальным, иначе потом могут быть проблемы с освобождением ресурсов
};

class fileStream : public stream // Определяем наследование как public
{
	private:
		char* buf;
		int bufSize;
	protected:
		FILE* f;
	public:
		long getPos() { return 0; }
		void setPos(long int) {}
		long seek(long,int) { return 0; }
		long getSize() { return 0; }
		void setSize(long) {}
		long read(char*,long) { return 0; }
		long write(char*,long) { return 0; }
		void readBuffer(void*,long) {}
		void writeBuffer(void*,long) {}
		int EoS() { return 0; }
		~fileStream() { }
		fileStream(char* name)
		{
			f = fopen(name, "r");
		}
// Декларация copyFrom здесь не нужна
};

long stream::copyFrom(stream* f,long l)
{
	long i;
	long C;
	char* c;
	long bufS;
	bufS=l;
	if(l>maxBuf)bufS=maxBuf;
	c=(char*)malloc(bufS);
	C=0;
	while(l!=0)
	{
		if(l>bufS)i=bufS;else i=l;
		i=f->read(c,i);
		write(c,i);
		l=l-i;
		C=C+i;
	}
	free(c);
	return C;
}//этого кода поидее достаточно

int main()
{
	fileStream* rf = new fileStream("C:\\AddNode.pas");
	fileStream* wf = new fileStream("C:\\AddNode1.pas");
	wf->copyFrom(rf,rf->getSize());

	return 0;
}
netrino вне форума Ответить с цитированием
Старый 02.11.2009, 01:18   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

УРА=)

спасибо=)))
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наследование на C++ dziga1989 Помощь студентам 5 22.10.2009 11:25
Классы и наследование. Scratch Общие вопросы C/C++ 9 27.09.2008 16:03
Наследование: абстрактный класс zak Общие вопросы C/C++ 4 22.12.2007 13:49