Форум программистов, компьютерный форум CyberForum.ru

Конструктор со строкой - именем файла - C++

Восстановить пароль Регистрация
 
Babysitter
 Аватар для Babysitter
78 / 103 / 34
Регистрация: 23.11.2015
Сообщений: 315
Завершенные тесты: 1
25.08.2016, 14:47     Конструктор со строкой - именем файла #1
есть класс вида
C++
1
2
3
4
class A {
    B b;
/* ... */
};
а у класса B конструктор B(istream&), дефолтного нет
если сделать у А конструктор такого же вида, то все хорошо
C++
1
A::A(istream& file) : b(file), /* ... */ {}
а есть ли способ не описывая дефолтный конструктор у B
изменить конструктор A, чтобы он принимал имя файла

например так
C++
1
2
3
4
5
6
class A {
    ifstream file;
    B b;
/* ... */
    A(const string& name) : file(name, ios_base::in), b(file), /* ... */ {}
};
но в этом случае мы получаем себе поле без копирующего конструктора,
да и вообще не хотелось бы владеть никакими ресурсами - открыл в конструкторе
поток, считал все и закрыл.
но на момент входа в тело конструктора b() уже должен быть вызван..

единственные решения -
оставить конструктор A(istream&) и не заниматься ерундой или
написать дефолтный конструктор для B и не заниматься ерундой?

Добавлено через 2 минуты
видимо что-то такое может сработать
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct B
{
    B(ifstream&& x) {}
};
 
struct A
{
    B b;
    A(const string& name) : b(ifstream(name, ios_base::in)) {}
};
 
int main()
{
    A a("hello");
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
25.08.2016, 14:55     Конструктор со строкой - именем файла #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Babysitter Посмотреть сообщение
видимо что-то такое может сработать
Только, если B делает move объекта x в свое владение.
Если там что-то такое:
C++
1
2
3
4
5
6
struct B
{
    B(ifstream&& x) : m_x(x) {}
 
    ifstream & m_x;
};
то получишь висячую ссылку после работы конструктора.

Добавлено через 2 минуты
Цитата Сообщение от Babysitter Посмотреть сообщение
не заниматься ерундой?
+
Варианты, которые приведут к этому, выбери сам исходя из реалий твоего кода.
Если у тебя дизайн такой, что A и B не владеют потоком, то зачем его ломать? Или делай другой дизайн или не ломай тот, что есть.
Babysitter
 Аватар для Babysitter
78 / 103 / 34
Регистрация: 23.11.2015
Сообщений: 315
Завершенные тесты: 1
25.08.2016, 14:58  [ТС]     Конструктор со строкой - именем файла #3
DrOffset, если вне тела конструктора B::B(istream&&) больше нигде попытки доступа нет, то все окей?
на } объект должен уничтожиться корректно.

Добавлено через 50 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
+
я понял
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
25.08.2016, 14:59     Конструктор со строкой - именем файла #4
Цитата Сообщение от Babysitter Посмотреть сообщение
если вне тела конструктора B::B(istream&&) больше нигде попытки доступа нет, то все окей?
Да, если с потоком работает только конструктор B, то все будет нормально. Временный объект потока будет жить до конца полного выражения.
Babysitter
 Аватар для Babysitter
78 / 103 / 34
Регистрация: 23.11.2015
Сообщений: 315
Завершенные тесты: 1
26.08.2016, 12:55  [ТС]     Конструктор со строкой - именем файла #5
раз уж мы об этом заговорили. такое делегирование - это ок?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
struct B
{
    B(ifstream& x) { std::cout << "l-ref\n"; }
    B(ifstream&& x) : B(x) { std::cout << "r-ref\n"; }
};
 
struct A
{
    B b;
    A(const string& name) : b(ifstream(name, ios_base::in)) {}
};
 
int main()
{
    // usage
    A a("hello1"); // A(const string&) > B(ifstream&&) > B(ifstream&)
    ifstream x("hello", ios_base::in);
    B b(x); // B(ifstream&)
}
Yandex
Объявления
26.08.2016, 12:55     Конструктор со строкой - именем файла
Ответ Создать тему
Опции темы

Текущее время: 07:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru