Я встретил интересный случай:
У меня есть файловый поток как член класса и функция, которая записывает данные в файл. Объект передается в качестве параметров другому классу, который инициализирует свой член параметром. У меня были некоторые проблемы из-за этого, и мне удалось решить их с помощью вектора строк и добавления строк в него. Но теперь я понимаю, что все еще передаю объект из одного класса в другой.
Вот пример того, что у меня есть:
class A
{
private:
std::ofstream oFile;
std::vector<std::string> oFileStringVec;
public:
A()
{
oFile.open("../Path/File.txt", std::fstream::out);
if (!oFile.is_open()) { std::cout<<"Error!!\n";}
}
~A() {}
void writeInfo(const std::string& s)
{ oFileStringVec.push_back(s); }
void closeFile()
{ oFile.close(); }
};
class B
{
private:
A ma;
public:
B(const A& aOb) : ma(aOb) {}
void foo()
{
// ...
ma.writeInfo(mystr);
}
// ...
};
class C
{
private:
A ma;
public:
C(const A& aOb) : ma(aOb) {}
// ...
void foo()
{
// ...
B myB(myA);
//...
}
};
И у меня есть функция, где я создаю объект C и вызываю его foo()
метод:
void bar()
{
// ...
A myA;
// ...
C myC(myA);
myC.foo();
//...
}
Я не совсем уверен, что здесь происходит. Офстрим создан не раз? Он создается только один раз, а потом его просто заново открывают? Не могли бы вы добавить в каждый деструктор oFile.close()
функционировать? Должен ли я передать в качестве параметра только вектор и использовать ofstream только в bar()
функционировать?
Я не совсем уверен, что здесь происходит. Офстрим создан не раз?
Это перемещено. Как из ссылка:
4) Переместить конструктор. Сначала переместите-создайте базовый класс из другого (который не влияет на указатель rdbuf ()), затем переместите-создайте член std :: basic_filebuf, затем вызовите this-> set_rdbuf (), чтобы установить новый basic_filebuf как rdbuf ( указатель в базовом классе.
Он создается только один раз, а потом его просто заново открывают?
Смотрите 1-й пункт.
Не могли бы вы добавить в каждый деструктор функцию oFile.close ()?
Это уже сделано в std::ofstream
деструктор автоматически
Должен ли я передать в качестве параметра только вектор и использовать ofstream только в функции bar ()?
Не могу сказать, что приведенные выше ответы имеют последствия для вашего варианта использования.
В вашем примере class A
просто открывает файл и пишет в него, давайте назовем его FileWriter
, Тогда у вас есть еще два класса: class B
а также class C
что оба создают копию этого FileWriter
(A
) даже когда им не нужно:
class B
{
private:
A ma;
public:
B(const A& aOb) : ma(aOb) {}
а также
class C
{
private:
A ma;
public:
C(const A& aOb) : ma(aOb) {}
// ...
void foo()
{
// ...
B myB(myA);
//...
}
Это очевидная ошибка проектирования, поскольку это была не композиция, а агрегация, иными словами: это не отношение «имеет», а отношение «использует». Что вы должны сделать, это:
class B
{
private:
const A& a_;
public:
CBar(const A& a) : a_(a) {...}
};
или если A
действительно предназначен для копирования, и ваша цель состоит в том, чтобы скопировать его, тогда он не должен содержать std::ofstream
объект, а скорее ссылка на него.