Можете ли вы предложить способ, как я мог бы передать "handle (* h)" внутри объекта? Так выглядит код в C.
int open(const char *name, ini_file_t **);
int read(ini_file_t *h, const char *sn, const char *kn, int *);
int write(ini_file_t *h, char *sn, char *kn, int);
int ini_file_close(ini_file_t *h);
Я пытаюсь сделать это в C++, устраняя (* h).
XTextFile {
public:
int open(const char *name);
int read(const char *sn, const char *kn, int *);
int write(char *sn, char *kn, int);
int ini_file_close();
};
Можете ли вы поделиться некоторыми советами, как я могу это сделать?
Или вопрос в том, правильно ли я делаю это в ООП?
Это будет моя интерпретация:
class XTextFile
{
public:
XTextFile(const std::string& name);// constructor replaces open()
~XTextFile();// destructor replaces ini_file_close
int read(const std::string& sn, const std::string& kn, int *);
int write(char *sn, char *kn, int);// not sure what these params are but they should also probably be some form of std::string
};
Конструкторы C++ используются для инициализации объекта, а деструктор очищает свои ресурсы, когда он свободен. Вы бы использовали этот объект следующим образом:
void someFunction()
{
XTextFile txt("c:\\filename.txt");
txt.read(....);
// txt is automatically closed when it goes out of scope.
}
XTextFile {
public:
int open(const char *name);
int read(const char *sn, const char *kn, int *);
int write(char *sn, char *kn, int);
int ini_file_close();
private:
ini_file_h * m_handle;
};
Разумеется, вам нужно предоставить подходящий конструктор для инициализации члена, например, "nullptr",
Здесь есть узнаваемый шаблон: ваш h
действительно похож на C++ на this
указатель. Значит, вы должны отказаться от XTextFile
и сделать его XIniFile
, причем функции-члены действуют на себя (это ядро ООП).
Затем, чтобы использовать полную мощность C++, реализуйте RAII: ваш файл должен быть открыт в его конструкторе и закрыт в своем деструкторе. Потратьте некоторое время на разработку или удаление своего копировального конструктора, оператора привязки и перемещение копий, если вы используете C++ 11.
Поместите ini_file_t
как частную переменную-член.
Вы можете заменить функцию open() конструктором. Сюда:
XTextFile {
private:
ini_file_t* m_h;
public:
XTextFile(const char *name);
~XTextFile();
int read(const char *sn, const char *kn, int *);
int write(char *sn, char *kn, int);
int ini_file_close();
};
Конструктор инициализирует атрибут m_h. Вы также можете использовать материал c++ (std :: string, std: vector и т.д.) Вместо char*
ini_file_t *
в ваш классXTextFile
.open
вероятно, следует сделать конструктором,close()
деструктором.