У меня есть класс, который принимает ссылку istream в конструкторе. Если конструктору передан временный объект, например myclass obj(ifstream("filename"));
будет ли, если бы поток был хорош для жизни obj
? Зависит ли он от того, назначен ли он ссылке или указателю в классе?
Например:
class test
{
public:
istream *p;
test(istream &is)
{
p = &is;
cout << "a constructor" << endl;
}
~test()
{
cout << "a destructor" << endl;
}
bool isgood()
{
return p->good();
}
};
int main()
{
test test(ifstream("test.cpp"));
cout << test.isgood() << endl;
}
Вывод:
a constructor
1
a destructor
Просто потому, что вывод говорит, что файл хорош, я не знаю, был ли он уничтожен или что. Если есть часть стандарта, который охватывает это, пожалуйста, дайте мне знать. благодаря
Извините, у меня недостаточно репутации для комментариев.
Временный istream
хорош только в конструкторе. Даже если вы используете адрес istream
для установки значения указателя, вы больше не сможете использовать его после возврата конструктора. Поскольку после вызова конструктора временный ifstream уже закрыт и разрушен. Таким образом, указатель будет указывать на мусор, как упоминал @Josh. Вы можете изменить свой код, чтобы передать имя файла в конструктор, и использовать имя файла для инициализации элемента ifstream
(а не указателя на ifstream). Затем вы можете использовать поток через продолжительность жизни объекта.
p
укажет на мусор