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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2012, 17:48   #1
Deicide
 
Регистрация: 01.10.2012
Сообщений: 4
По умолчанию Класс для работы с файлами (visual c++)

День добрый. Столкнулся со следующей проблемой.
Задание: создать класс, инкапсулирующий работу с файлами через стандартную библиотеку С(fopen,fclose и т.д.). Реализовать методы открытия, закрытия, записи для double,int, записи в текстовом и двоичном виде.
Собственно, написал следующий код (тут описаны еще не все методы):
Код:
#include "stdafx.h"
#include <iostream>
#include <stdio.h>

using namespace std;

class Files
{
private:
	FILE *f;
	char* FileName;
public:
	Files(){};// конструктор по умолчанию
	Files(char* FileName)
	{
		f=fopen(FileName,"a+");
	};

	void Files::Open(Files f) //метод открытия файла
	{
		
		f.f=fopen(f.GetName(),"w+");
	}
	
	char* Files::GetName(){return FileName;} //ф-я, возвращающая имя
//файла
	void Files::WriteD(double *d,int n,Files f) // запись для double
	{
		
		for(int i=0;i<n;i++)
			fprintf(f.f,"%f",d[i]);
	
	}
	
	void Files::WriteInt(int *in,int n, Files f) // запись для int
	{
		for(int i=0;i<n;i++)
			fprintf(f.f,"%i",in[n]);
		
	}
	
	void Files::WriteHex(double *d,int n,Files &f) // запись в двоичном коде
	{
		for(int i=0;i<n;i++)
			fprintf(f.f,"%x",d[n]);	
	}
	~Files();
	
	
};
void main ()
{
	
	char* Name="2.txt";
	Files f1=Files(Name);
        system("pause");
}
так вот. при запуске программы вылетает следующая ошибка:
Error3 error LNK2019: unresolved external symbol "public: __thiscall Files::~Files(void)" (??1Files@@QAE@XZ) referenced in function _main
В чем конкретно моя ошибка? Подскажите, как правильно задать конструктор и методы.
Deicide вне форума Ответить с цитированием
Старый 02.10.2012, 17:59   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

У вас нет кода деструктора, вот linker и ругается. Декларация есть, дефиниции нету.

Кроме того, обратите внимание на ваш метод Open - несколько странно получать в качестве аргумента копию класса Files. В результате у вас будут два объекта Files указывающие на один и тот же FILE
waleri вне форума Ответить с цитированием
Старый 02.10.2012, 22:22   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

void Files::Open(Files f)

для функций. описанных внутри класса, раз его приписывать не нужно.
функция Open - плохая. Получает объект типа File, а должна имя файла

char* Files::GetName()

возвращает не-константный указатель, сама функция также не константная. фтопку.

отсутствую переопределенный оператор присваивания, конструктор копии.
в итоге класс нежизнеспособен.

для примера залезь в исходники MFC и укради оттуда класс CFile
Rififi вне форума Ответить с цитированием
Старый 05.10.2012, 08:23   #4
Deicide
 
Регистрация: 01.10.2012
Сообщений: 4
По умолчанию

Цитата:
У вас нет кода деструктора, вот linker и ругается. Декларация есть, дефиниции нету.
Спасибо
Цитата:
отсутствую переопределенный оператор присваивания, конструктор копии.
Зачем они нужны для моего примера?

У меня в итоге получается так(фрагмент метода и работы с ним):
Код:
void Files::WriteD(double *d,int n,Files &f)
	{	
		for(int i=0;i<n;i++)
			fprintf(f.f,"%f\n",d[i]);
	}
Код:
void main ()
{
	double db[3]={1.95,2.4,3};
	char* Name="2.txt";
	Files f1=Files(Name);
	f1.WriteD(db,3,f1);
}
Можно ли сделать иначе, так, чтобы, например, не писать f1.WriteD(db,3,f1)?
Deicide вне форума Ответить с цитированием
Старый 05.10.2012, 09:55   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

1) Зачем вам аргумент на клас Files в методе класа Files?
2) Copy constructor вам не нужен пока, потому что у вас нет деструктора. Обычно деструктор закрывает файл. Если он у вас появится БЕЗ copy constructor и assignment operator то у вас будут ДВА (а то и более) деструктора, которые будут пытаться закрыть один и тот же файл.
waleri вне форума Ответить с цитированием
Старый 06.10.2012, 19:37   #6
Deicide
 
Регистрация: 01.10.2012
Сообщений: 4
По умолчанию

Цитата:
1) Зачем вам аргумент на клас Files в методе класа Files?
С этим разобрался
Цитата:
2) Copy constructor вам не нужен пока, потому что у вас нет деструктора. Обычно деструктор закрывает файл. Если он у вас появится БЕЗ copy constructor и assignment operator то у вас будут ДВА (а то и более) деструктора, которые будут пытаться закрыть один и тот же файл.
А вот здесь не понял.
И деструктор у меня есть.
Программа работает корректно (по крайней мере делает то, что должна: записывает нужные данные в файл).
Deicide вне форума Ответить с цитированием
Старый 06.10.2012, 20:58   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Значит ваш деструктор не закрывает файл...
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс для работы с массивом в С++. ALEX8989 Помощь студентам 2 15.04.2012 19:18
Класс для работы с массивом.С++ bender91 Помощь студентам 2 14.04.2012 21:32
класс для работы с деревьями CodeNOT C++ Builder 1 19.05.2011 22:23
Написать класс для работы с двоичными числами в Visual C++ 2008 Maxs Фриланс 1 23.12.2009 21:07