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

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

Войти
Регистрация
Восстановить пароль
 
 
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
#1

Указатель на 2 разные вещи.. - C++

17.08.2009, 18:41. Просмотров 979. Ответов 19
Метки нет (Все метки)

Доброго времени суток!
Возникла следующая идея - создается указатель на поток вывода, потом он указывает либо на cout, либо на файл.
Фишка идеи в том, что тогда все функции обращаются к указателю, не зная даже на что он указывает. А то, что они выводят идет либо в cout, либо в файл в зависимости от параметров командной строки(если есть параметр - адрес, то указатель указывает на файл, если параметров нет, то на cout).
Я пытался сделать это так:
C++
1
2
3
4
5
6
7
8
9
10
11
ostream* output;
 
switch(argc)
        {
                case 1:
                        output = &cout;  //указатель на cout
                case 2:
                        {ofstream outfile (argv[1]);
                                if (!outfile) exit(1);
                        output = &outfile;}    //указатель на файл
        }
Но возникли следующие проблемы:
1)Когда outfile исчезает ( область его видимости только {}) и остается только указатель на него, работает ли указатель?
2)В конце надо закрыть файл, а в классе указателя нет close()

Подскажите, как нужно организовать эту идею с указателем.
Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2009, 18:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на 2 разные вещи.. (C++):

Как реализовать указатель "n" размерности на разные объекты? - C++
Подскажите как реализовать следующее: //есть базовый класс у которого куча производных классов с перегруженными вируальными функциями....

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

Функция, принимающая указатель и число байт и выделяющая память под указатель - C++
Здравствуйте. Задача легкая, но почему-то завис Нужно написать функцию, принимающую указатель и число байт и выделяющую память под...

Зачем нужен указатель на указатель при работе с однонаправленным списком? - C++
День добрый. Столкнулся с непониманием этой темы. В частности, совершенно непонятен алгоритм инициализации такого вот списка. Например:...

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include <iostream> #include <conio.h> #include <stdlib.h> #include <time.h> using namespace std; void sort_1(const...

19
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 18:55 #2
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
1)Когда outfile исчезает ( область его видимости только {}) и остается только указатель на него, работает ли указатель?
указатель работает. но объект локальный - после выполнения блока (аля {}) объект разрушается. тебе надо тогда создавать динамически, чтобы избегнуть этого.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ostream* output;
 
switch(argc)
        {
                case 1:
                        output = &cout;  //указатель на cout
                        break; // это необходимо обязательно!
                case 2:
                        { output = new ofstream(argv[1]);
                                if (!output) exit(1);
                        }
                       break;
        }
 
// и по завершении, не забыть удалить:
delete output;
1
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
17.08.2009, 19:09  [ТС] #3
Ладно, с этим разобрался, спасибо.
Теперь осталось понять, как закрывать файл..
Подскажите кто нибудь, плиз!
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.08.2009, 19:10 #4
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
Теперь осталось понять, как закрывать файл..
C++
1
outfile.close();
0
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
17.08.2009, 19:15  [ТС] #5
Дак в том то и дело, что указатель ostream!! В ostream нет функции close()..
Господа программисты, а если создать указатель ofstream (файловый, где есть и close() и eof()), то такой указатель сможет корректно работать с cout?
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.08.2009, 19:18 #6
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
Дак в том то и дело, что указатель ostream!!

C++
1
2
outfile->close();
delete outfile;
0
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
17.08.2009, 19:25 #7
Может попробовать,чтобы ostream указывал на ofstream?А если нет то на cout?
1
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
17.08.2009, 19:32  [ТС] #8
C++
1
2
3
4
5
6
ostream* output;
 
int main(int argc, char* argv[])
{
     output->close();
}
Выдает ошибку - E2316 'close' is not a member of 'ostream'

Добавлено через 2 минуты 47 секунд
Цитата Сообщение от #pragma Посмотреть сообщение
Может попробовать,чтобы ostream указывал на ofstream?А если нет то на cout?
В том то и дело, что так и есть. Указатель типа ostream указывает либо на ofstream либо на cout. Но при попытке применить к указателю ostream, указывающему на ofstream, close(), компилятор выдает ошибку..
0
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 19:34 #9
VorobeY1326, при вызове
C++
1
delete output;
вызовится деструктор.
Если классы писали не индусы, то в деструкторе будет код закрытия потока.
так что, главное удали.

вообще можно вот так:
C++
1
((ofstream*)output)->close();
но мне это не нравится
1
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.08.2009, 19:36 #10
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
но мне это не нравится
можно с помощью dynamic_cast определить корректность объекта. но мне это тоже не нравится.
1
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 19:39 #11
Цитата Сообщение от zim22 Посмотреть сообщение
можно с помощью dynamic_cast
можно и со static_cast. но от этого смысл не меняется. я лишь показал идею - приведение к типу.
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.08.2009, 19:42 #12
VorobeY1326, я понял что ты хочешь сделать.
не лучше ли так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include <ostream>
#include <fstream>
#include <iostream>
 
void write(std::ostream &out) {
  out << "yo";
}
 
int _tmain(int argc, _TCHAR* argv[])
{  
  write(std::cout);
  
  std::ofstream out("file.txt");
  write(out);
  out.close();
 
  return 0;
}
Добавлено через 1 минуту 5 секунд
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
можно и со static_cast
нет. нельзя.
static_cast тупо один тип в другой конвертирует.
dynamic_cast следит за корректностью приведения. и в случае, когда приведение к подклассу завершилось неудачей - он либо бросает исключение или возвращает ноль.
0
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
17.08.2009, 19:45  [ТС] #13
Спасибо Monte-Cristo, zim22 и #pragma!
Класс действительно писали не индусы..
Я просто в конце удалил output и файл закрылся.
0
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 19:47 #14
Цитата Сообщение от zim22 Посмотреть сообщение
нет. нельзя.
C++
1
2
    ostream* output = new ofstream("c:\\tex.txt");
    static_cast<ofstream*>(output)->close();
0
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
17.08.2009, 19:47  [ТС] #15
zim22, не, так не лучше..
Потому что идея в том, что указатель может указывать на файл, а может на cout.
То есть данные идут либо в файл, либо в поток вывода.
0
17.08.2009, 19:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2009, 19:47
Привет! Вот еще темы с ответами:

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель - C++
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef struct tree { int data; tree *left, *right,...

Объяснить работу функции, возвращающей указатель на указатель на char - C++
Добрый день! Сможете объяснить что означает запись char **InputFile(int &amp;strings);? Почему именно двойное **? Буду очень благодарна...

Передача умного указателя в функцию принимающую указатель на указатель - C++
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...

Указатель на указатель, функции для создания новых массивов? - C++
Всем привет! У меня в коде есть несколько новых массивов, чтобы не повторяться я создам функцию которая будет выделять память под новые...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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