Присвоение суда к имени переменной

Да.

Либо просто щелкните правой кнопкой мыши класс и выберите «Refactor-> Rename», или вставьте соответствующий package foo.bar вверху и используйте Ctrl-1 для быстрого удаления.

14
задан user12576 9 January 2009 в 16:05
поделиться

6 ответов

Используйте ссылку. Обратите внимание, что ссылка должна иметь тип std::ostream, не std::ofstream, так как std::cout std::ostream, таким образом, необходимо использовать наименее общий знаменатель.

std::ofstream realOutFile;

if(outFileRequested)
    realOutFile.open("foo.txt", std::ios::out);

std::ostream & outFile = (outFileRequested ? realOutFile : std::cout);
36
ответ дан 1 December 2019 в 06:24
поделиться

Я предполагаю, что Ваша программа ведет себя как стандартные инструменты Unix, что при отсутствии предоставления файл запишет в стандартный вывод, и при предоставлении файл запишет в тот файл. Можно перенаправить cout для записи в другой потоковый буфер. Пока Ваше перенаправление живо, все записанное в суд прозрачно записано в место назначения, которое Вы назначили. После того как объект перенаправления выходит из объема, исходный поток помещается и производится, запишет в экран снова:

struct CoutRedirect { 
    std::streambuf * old; 
    CoutRedirect():old(0) {
        // empty
    }

    ~CoutRedirect() {
        if(old != 0) {
            std::cout.rdbuf(old);
        }
    }

    void redirect(std::streambuf * to) {
        old = std::cout.rdbuf(to);
    }
}

int main() {
    std::filebuf file;
    CoutRedirect pipe;
    if(outFileRequested) {
        file.open("foo.txt", std::ios_base::out);
        pipe.redirect(&file);
    }
}

Теперь, суд перенаправляется в файл, пока канал жив в основном. Можно сделать это большим количеством "производства готовый" путем создания этого non-copyable, потому что это не готово быть скопированным: Если бы копия выходит из объема, она уже восстановила бы исходный поток.

8
ответ дан 1 December 2019 в 06:24
поделиться

Можно найти очень подробное объяснение того, как сделать это здесь: http://groups.google.com/group/comp.lang.c++/msg/1d941c0f26ea0d81?pli=1

, Надо надеяться, кто-то опишет это более ясно, чтобы переполнение стека взяло точки...

3
ответ дан 1 December 2019 в 06:24
поделиться

Следующий Adam Rosenfield дорожки, но решение ссылочной проблемы инициализации с тернарными операторами и операторами запятой:

bool outFileRequested = false;

std::ofstream realOutFile;
std::ostream & outFile = outFileRequested
    ? realOutFile.open("foo.txt", std::ios::out), realOutFile
    : std::cout;

outFile << "some witty remark";

(Протестированный в VS)

1
ответ дан 1 December 2019 в 06:24
поделиться

Я не уверен, что можно присвоить суд переменной типа ofstream., суд является объектом типа ostream (тогда как cin имеет тип istream), и я не уверен, что каждый наследовался другому. Так, возможно, что-то проверяющее, чтобы видеть, давался ли файл/существовался и создание соответствующего потокового типа, было бы лучшим подходом.

0
ответ дан 1 December 2019 в 06:24
поделиться

Я думаю Adam на правильном пути, но я не думаю, что можно присвоить ссылки - необходимо использовать указатель вместо этого:

std::ofstream realOutFile;
std::ostream * poutFile;

if(outFileRequested)
{
    realOutFile.open("foo.txt", std::ios::out);
    poutFile = &realOutFile;
}
else
    poutFile = &std::cout;

Вы могли затем определить ссылку, чтобы быть значением указателя, но это не будет глобально

std::ostream & outFile = *poutFile;
0
ответ дан 1 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: