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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Babysitter
80 / 107 / 35
Регистрация: 23.11.2015
Сообщений: 331
Завершенные тесты: 1
#1

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

25.08.2016, 14:47. Просмотров 216. Ответов 4
Метки нет (Все метки)

есть класс вида
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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2016, 14:47     Конструктор со строкой - именем файла
Посмотрите здесь:

Сравнение со строкой из файла - C++
Подскажите пожалуйста,как написать сравнение введённой информацией с каждой строкой в имеющемся файле,потому что у меня сравнивается только...

Работа со строкой из файла - C++
Словом текста считается любая последовательность цифр и букв русского алфавита длиной не более 6 символов; между соседними словами - не...

Дано имя файла целых чисел. Найти количество элементов, содержащихся в данном файле. Если файла с таким именем не существует, то вывести –1 - C++
Дано имя файла целых чисел. Найти количество элементов, содержащихся в данном файле. Если файла с таким именем не существует, то вывести...

Прочитать одной строкой с файла - C++
собственно в этом и вопрос, как считать целой строкой #include <iostream> #include <iomanip> #include <sstream> #include...

Обработка считывания текста из файла с завершающей пустой строкой - C++
Вроде бы вопрос простой - используй fstream и живи спокойно. Так и было до поры, до времени. Был такой код: double tmp; ...

Создать конструктор загружающий данные из файла - C++
Создать метод "вывод из файла", или как конструктор сделать, вот как я пытаюсь product (std::ifstream& fin, product& p1) { ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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
80 / 107 / 35
Регистрация: 23.11.2015
Сообщений: 331
Завершенные тесты: 1
25.08.2016, 14:58  [ТС]     Конструктор со строкой - именем файла #3
DrOffset, если вне тела конструктора B::B(istream&&) больше нигде попытки доступа нет, то все окей?
на } объект должен уничтожиться корректно.

Добавлено через 50 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
+
я понял
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
25.08.2016, 14:59     Конструктор со строкой - именем файла #4
Цитата Сообщение от Babysitter Посмотреть сообщение
если вне тела конструктора B::B(istream&&) больше нигде попытки доступа нет, то все окей?
Да, если с потоком работает только конструктор B, то все будет нормально. Временный объект потока будет жить до конца полного выражения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2016, 12:55     Конструктор со строкой - именем файла
Еще ссылки по теме:

Название файла с именем значения пременной - C++
Добрый день, перерыл весь форум никак не могу найти способ названия файла по значению переменной. Вот положим есть переменная x=3.14 ...

Создание файла с именем, которое указано в переменной - C++
Здравствуйте! Возможно ли создать файл с именем, которое указано в переменой например nazv Если да, покажите пример

fopen, _write, _read с динамическим именем файла - C++
Много перерыл, не нашел. Нужно открывать файл с динамическим названием strcpy_s(cc, "name.par"); FILE *fp=fopen(cc,"r"); Так...

Сохранение файла под указанным пользователем именем - C++
у меня есть функция, которая сохраняет редактируемый файл и выходит: void shift_f10(char *filename) { FILE *f1; /*Редактируемый...

Как сделать переменную типа char именем файла - C++
Есть переменная(массив) типа char с произвольным количеством символов внитри Как сделать так чтобы когда я создаю файл к примеру таким...

Как должен отработать конструктор ofstream (char* file) при отсутствии файла? - C++
Методом научного тыка я выяснил, что если такого файла нет, он его создаёт; но где оговорено такое поведение конструктора? Я так понимаю,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Babysitter
80 / 107 / 35
Регистрация: 23.11.2015
Сообщений: 331
Завершенные тесты: 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     Конструктор со строкой - именем файла
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru