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

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

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

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

25.08.2016, 14:47. Просмотров 224. Ответов 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");
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2016, 14:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор со строкой - именем файла (C++):

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

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

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

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

Сборка библиотеки и ошибка "fatal error LNK1149: имя выходного файла совпадает с именем входного файла" - C++
при сборке библиотеки возникает такая ошибка LINK : fatal error LNK1149: имя выходного файла совпадает с именем входного файла, объясните...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DrOffset
7147 / 4288 / 966
Регистрация: 30.01.2014
Сообщений: 7,091
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 не владеют потоком, то зачем его ломать? Или делай другой дизайн или не ломай тот, что есть.
0
Babysitter
80 / 107 / 35
Регистрация: 23.11.2015
Сообщений: 332
Завершенные тесты: 1
25.08.2016, 14:58  [ТС] #3
DrOffset, если вне тела конструктора B::B(istream&&) больше нигде попытки доступа нет, то все окей?
на } объект должен уничтожиться корректно.

Добавлено через 50 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
+
я понял
0
DrOffset
7147 / 4288 / 966
Регистрация: 30.01.2014
Сообщений: 7,091
25.08.2016, 14:59 #4
Цитата Сообщение от Babysitter Посмотреть сообщение
если вне тела конструктора B::B(istream&&) больше нигде попытки доступа нет, то все окей?
Да, если с потоком работает только конструктор B, то все будет нормально. Временный объект потока будет жить до конца полного выражения.
1
Babysitter
80 / 107 / 35
Регистрация: 23.11.2015
Сообщений: 332
Завершенные тесты: 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&)
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2016, 12:55
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.08.2016, 12:55
Ответ Создать тему
Опции темы

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