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

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

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

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

28.07.2012, 14:03. Просмотров 3278. Ответов 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.вернуть_имя_файла);?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2012, 14:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс содержащий объект типа ofstream - не компилится! (C++):

Есть объект типа T, но если вместо него подставить вызов функции, возвращающей T, код не компилится, почему? - C++
Есть объект типа vector&lt;int&gt;, но если вместо него подставить вызов функции, возвращающей vector&lt;int&gt;, код не компилится (template мутит...

Объявить класс содержащий 1 переменную А закрытого типа. - C++
объявить класс содержащий 1 переменную А закрытого типа. И функцию которая считывает переменную введенную с клавиатуры и выводит на экран....

Создайте класс Тест, содержащий две закрытые переменные типа int с именами count и max - C++

Определить класс химический элемент, содержащий информацию о названии элемента его химических свойствах. Определить класс медикаменты, содержащий разн - C++
Определить класс химический элемент, содержащий информацию о названии элемента его химических свойствах. Определить класс медикаменты,...

Создайте класс employee, который содержит имя (объект класса string) и номер (типа long) служащего - C++
Создайте класс employee, который содержит имя (объект класса string) и но- мер (типа long) служащего. Включите в него метод getdata(),...

Нюансы синтаксиса: использование объектов типа ofstream - C++
Куда нужно дописать std:: ? #include &lt;iostream&gt; #include &lt;fstream&gt; int main (void){ ofstream file; file.open...

21
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
29.07.2012, 13:53  [ТС] #16
хорошо, спасибо)
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
29.07.2012, 14:06 #17
Итак, для использования fstream как члена класса требуются веские основания. Но если такие основания есть и требуется обеспечить копирование объектов класса, содержащего какой-либо разделяемый ресурс (не только fstream), то можно воспользоваться "умными" указателями с подсчётом ссылок, например std::shared_ptr (для C++11) или boost::shared_ptr.
0
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
29.07.2012, 23:24  [ТС] #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> ? И почему файл не находится?
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,797
Записей в блоге: 17
29.07.2012, 23:25 #19
Сначало надо установить boost
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
30.07.2012, 02:06 #20
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
В чем различие между shared_ptr из <boost/shared_ptr.hpp> и из <memory> ? И почему файл не находится?
В том, что сначала он появился в boost и только потом был включён в библиотеку языка. Так что если устраивает невозможность компиляции старыми компиляторами, то можно обойтись и без boost.
Если нужен буст и он уже установлен, то надо указать компилятору директорию с заголовочными файлами (ту, в которой расположена директория boost с заголовками). Где-то в настройках проекта, наверное, я не знаток VS2010.
В коде, на первый взгляд, всё нормально. В принципе деструктор и конструктор копии при этом необязательны, но и хуже от них не станет.
1
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
30.07.2012, 11:01  [ТС] #21
Спасибо!+)
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
31.07.2012, 16:04 #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, потом один из этих объектов разрушили. При этом закрывается общий файл. Не надо явно закрывать поток в деструкторе, он и сам прекрасно закроется, когда будет разрушаться объект потока.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2012, 16:04
Привет! Вот еще темы с ответами:

Нужно объект типа класс проинициализировать с помощью перегруженного конструктора Class::Class( bool a ) - C++
Плиз помогите. Не знал, что я такой чайник.) Итак: есть два класса: CMyClass.h CMyClass.cpp и

интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект - C++
Привет всем. Необходимо реализовать интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект. Не...

Не удаётся создать безымянный объект типа vector моего типа - C++
Собсно #include &lt;vector&gt; using namespace std; //Вот мой австорский тип struct kletka { int i, j; kletka(int x, int...

Класс объявление с элементом типа класс Текст - C++
Необработанное исключение в &quot;0x770015de&quot; в &quot;FAQ.exe&quot;: 0xC0000005: Нарушение прав доступа при записи...


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

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

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