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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.82
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
#1

Класс содержащий объект типа ofstream - не компилится! - C++

28.07.2012, 14:03. Просмотров 3153. Ответов 21
Метки нет (Все метки)

Здравствуйте! Помогите пожалуйста!=)

есть код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <fstream>
 
    class Monstr
    {
        private:
            std::ofstream out;
        public:
            Monstr() : out("test", std::ios::app | std::ios::out){}
            ~Monstr();
    };
 
 
int main(void)
{
    Monstr Y;
    Monstr X(Y);
    system("pause");
    return 0;
}
есть ошибка:

1>c:\program files\microsoft visual studio 10.0\vc\include\ostream(604): error C2249: std::basic_ios<_Elem,_Traits>::operator =: нет доступного пути к private член, объявленному в виртуальном базовом классе "std::basic_ios<_Elem,_Traits>"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files\microsoft visual studio 10.0\vc\include\ios(177): см. объявление "std::basic_ios<_Elem,_Traits>::operator ="
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> Сообщение диагностики возникло в созданной компилятором функции "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator =(const std::basic_ostream<_Elem,_Traits> &)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1>


Почему?

Добавлено через 5 минут
И если размещают объекты класса [i/o]fstream в классе, то как? Или что-то в конструкторе копирования для этого делают обычно? И еще, как вернуть имя файла, на который ссылается объект класса [i/o]fstream. Т.е.

ofstream out1("test");
ofstream out2(out.вернуть_имя_файла);?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2012, 14:03     Класс содержащий объект типа ofstream - не компилится!
Посмотрите здесь:
C++ Есть объект типа T, но если вместо него подставить вызов функции, возвращающей T, код не компилится, почему?
Объявить класс содержащий 1 переменную А закрытого типа. C++
C++ Создайте класс Тест, содержащий две закрытые переменные типа int с именами count и max
C++ Определить класс химический элемент, содержащий информацию о названии элемента его химических свойствах. Определить класс медикаменты, содержащий разн
C++ Создайте класс employee, который содержит имя (объект класса string) и номер (типа long) служащего
C++ Нюансы синтаксиса: использование объектов типа ofstream
C++ Нужно объект типа класс проинициализировать с помощью перегруженного конструктора Class::Class( bool a )
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
29.07.2012, 13:53  [ТС]     Класс содержащий объект типа ofstream - не компилится! #16
хорошо, спасибо)
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
29.07.2012, 14:06     Класс содержащий объект типа ofstream - не компилится! #17
Итак, для использования fstream как члена класса требуются веские основания. Но если такие основания есть и требуется обеспечить копирование объектов класса, содержащего какой-либо разделяемый ресурс (не только fstream), то можно воспользоваться "умными" указателями с подсчётом ссылок, например std::shared_ptr (для C++11) или boost::shared_ptr.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
29.07.2012, 23:24  [ТС]     Класс содержащий объект типа ofstream - не компилится! #18
ведь для использования shared_ptr надро подключить
C++
1
#include <boost/shared_ptr.hpp>
? Просто у меня он не находит такого файла (MVS2010)...

Добавлено через 23 минуты
Я правильно все сделал?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// tesssst.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
//#include <boost/shared_ptr.hpp>
#include <fstream>
#include <memory>
 
    class Monstr
    {
        private:
 
            static int count;
            std::string file_name;
            std::shared_ptr<std::ofstream>out;
        public:
            Monstr(std::string file_name = "test") : out(new std::ofstream(file_name, std::ios::app | std::ios::out))
            {
                this->file_name = file_name;
            //  std::ofstream out(file_name, std::ios::app | std::ios::out);
                *out << "constructor" << std::endl;
                //(*out).close();
            }
            Monstr(const Monstr &);
            ~Monstr()
            {
                //std::ofstream out("test", std::ios::app | std::ios::out);
                *out << "destructor" << std::endl;
                (*out).close();
            }
            void OUT()const{ 
                //std::ofstream out("test", std::ios::app | std::ios::out); 
                count++; 
                (*out) << "count = " << count << std::endl;
            //  out.close();
            }   
    };
 
    int Monstr::count;
 
    Monstr::Monstr(const Monstr & monstr)
    {
        this->file_name = monstr.file_name;
        //std::ofstream out("test", std::ios::app | std::ios::out);
        out = monstr.out;
        (*out) << "constructor_copy" << std::endl;
    //  (*out).close();
    }
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Monstr Y;
    Monstr X(Y);
    X.OUT();
    Y.OUT();
    system("pause");
    return 0;
}
Добавлено через 2 минуты
В чем различие между shared_ptr из <boost/shared_ptr.hpp> и из <memory> ? И почему файл не находится?
Avazart
Эксперт С++
7117 / 5294 / 273
Регистрация: 10.12.2010
Сообщений: 23,413
Записей в блоге: 17
29.07.2012, 23:25     Класс содержащий объект типа ofstream - не компилится! #19
Сначало надо установить boost
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
30.07.2012, 02:06     Класс содержащий объект типа ofstream - не компилится! #20
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
В чем различие между shared_ptr из <boost/shared_ptr.hpp> и из <memory> ? И почему файл не находится?
В том, что сначала он появился в boost и только потом был включён в библиотеку языка. Так что если устраивает невозможность компиляции старыми компиляторами, то можно обойтись и без boost.
Если нужен буст и он уже установлен, то надо указать компилятору директорию с заголовочными файлами (ту, в которой расположена директория boost с заголовками). Где-то в настройках проекта, наверное, я не знаток VS2010.
В коде, на первый взгляд, всё нормально. В принципе деструктор и конструктор копии при этом необязательны, но и хуже от них не станет.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
30.07.2012, 11:01  [ТС]     Класс содержащий объект типа ofstream - не компилится! #21
Спасибо!+)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2012, 16:04     Класс содержащий объект типа ofstream - не компилится!
Еще ссылки по теме:
интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект C++
C++ Не удаётся создать безымянный объект типа vector моего типа
C++ Класс объявление с элементом типа класс Текст
Класс содержащий vector C++
C++ Сократить объект типа string

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
31.07.2012, 16:04     Класс содержащий объект типа ofstream - не компилится! #22
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
C++
1
2
3
4
5
6
            ~Monstr()
            {
                //std::ofstream out("test", std::ios::app | std::ios::out);
                *out << "destructor" << std::endl;
                (*out).close();
            }
Всё-таки, пожалуй, в таком виде деструктор скорее вреден, чем полезен.
Допустим, создали объект obj1, потом он скопировался в объект obj2, потом один из этих объектов разрушили. При этом закрывается общий файл. Не надо явно закрывать поток в деструкторе, он и сам прекрасно закроется, когда будет разрушаться объект потока.
Yandex
Объявления
31.07.2012, 16:04     Класс содержащий объект типа ofstream - не компилится!
Ответ Создать тему
Опции темы

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