Реактивирует ли конструктор копирования элемент файла

Я встретил интересный случай:

У меня есть файловый поток как член класса и функция, которая записывает данные в файл. Объект передается в качестве параметров другому классу, который инициализирует свой член параметром. У меня были некоторые проблемы из-за этого, и мне удалось решить их с помощью вектора строк и добавления строк в него. Но теперь я понимаю, что все еще передаю объект из одного класса в другой.

Вот пример того, что у меня есть:

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() функционировать?

0

Решение

Я не совсем уверен, что здесь происходит. Офстрим создан не раз?

Это перемещено. Как из ссылка:

4) Переместить конструктор. Сначала переместите-создайте базовый класс из другого (который не влияет на указатель rdbuf ()), затем переместите-создайте член std :: basic_filebuf, затем вызовите this-> set_rdbuf (), чтобы установить новый basic_filebuf как rdbuf ( указатель в базовом классе.


Он создается только один раз, а потом его просто заново открывают?

Смотрите 1-й пункт.

Не могли бы вы добавить в каждый деструктор функцию oFile.close ()?

Это уже сделано в std::ofstream деструктор автоматически

Должен ли я передать в качестве параметра только вектор и использовать ofstream только в функции bar ()?

Не могу сказать, что приведенные выше ответы имеют последствия для вашего варианта использования.

1

Другие решения

В вашем примере 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 объект, а скорее ссылка на него.

1

По вопросам рекламы [email protected]