Когда должен я интересоваться станд.:: iostream:: часовой?

Ссылки онлайн имеют довольно краткие и неопределенные описания на цели std::iostream::sentry. Когда я должен интересоваться этим маленьким существом? Если это только предназначается, чтобы использоваться внутренне, почему обнародовали его?

27
задан Emile Cormier 19 February 2010 в 18:18
поделиться

3 ответа

Большинство людей никогда не будут писать код, в котором необходимо создавать часовые объекты. Часовой объект нужен, когда/если вы извлекаете данные из (или вставляете их в) буфера потока, который лежит в основе самого объекта потока.

Пока ваш оператор вставки/извлечения использует другие члены/операторы iostream для выполнения своей работы, ему не придется иметь дело с созданием часового объекта (потому что эти другие операторы iostream будут создавать и уничтожать часовые объекты по мере необходимости).

12
ответ дан 28 November 2019 в 05:45
поделиться

Он используется всякий раз, когда вам нужно извлечь или вывести данные с помощью потока. То есть всякий раз, когда вы создаете оператор >> , оператор извлечения, или operator << , оператор вставки.

Его цель состоит в том, чтобы упростить логику: «Установлены ли какие-либо биты сбоя? Синхронизируйте буферы. Для входных потоков, при желании, уберите любые пробелы. Хорошо, готовы?»

Все операторы потока извлечения должны начинаться с :

// second parameter to true to not skip whitespace, for input that uses it
const std::istream::sentry ok(stream, icareaboutwhitespace);

if (ok)
{
    // ...
}

И все операторы потока вставки должны начинаться с:

const std::ostream::sentry ok(stream); 

if (ok)
{
    // ...
}

Это просто более чистый способ (что-то похожее на):

if (stream.good())
{
    if (stream.tie())
        stream.tie()->sync();

    // the second parameter
    if (!noskipwhitespace && stream.flags() & ios_base::skipws)
    {
        stream >> std::ws;            
    }
}

if (stream.good())
{
    // ...
}

ostream просто пропускает пробел.

14
ответ дан 28 November 2019 в 05:45
поделиться

Если установлен WinDbg , используйте меню File Open Executable для открытия приложения непосредственно под отладчиком и немедленного автоматического разрыва.

Затем можно использовать команды в разделе Debug (т.е. Go ) для нормального выполнения и отладки. Также загрузите Расширения SOS . Не так хорошо, как Visual Studio, но полезно, если у вас есть только EXE (и, надеюсь, PDB, хотя это необязательно) и нет источника.

Пример : Это мой исходный код, который, как мы предполагаем, недоступен:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        int x = 10 - 10;
        int i = 2000/x;

        Application.Run(new Form1());
    }

Это происходит немедленно, без возможности вовремя подключить отладчик. Это выход WinDbg после попадания «Run»:

Удален dead ImageShack ссылка - Freehand круги по мне

После загрузки SOS.dll, вы можете использовать! DumpStack, чтобы увидеть, где было выброшено исключение:

Удален dead ImageShack ссылка - нет Freehand круги, извините!

Обратите внимание, что оптимизация JIT или компилятора может привести к встраиванию методов, что может сделать StackTrace не 100% надежным, но для быстрого обзора он работает.

WinDbg является немного тайным, но как только вы получили некоторые основы сделано это потрясающе и по крайней мере помогает найти корень проблемы.

-121--4571367-

Конструкторы ближе к статическим методам, чем к «регулярным» методам. Как и статические методы, они могут быть перегружены , но не переопределены . То есть они не наследуются, но могут быть переопределены.

public BaseClass
{
   public BaseClass( String s ) { ... }
   public static void doIt ( String s ) { ... }
}

public SubClass extends BaseClass
{
   public SubClass( String s )  { ... }
   public static void doIt ( String s ) { ... }
}

public SubClass2 extends BaseClass
{
}

new SubClass( "hello" );
SubClass.doIt( "hello" ); 

new SubClass2( "hello" ); // NOK
SubClass2.doIt( "hello" ); // NOK

Конструкторы и статические методы никогда не отправляются динамически (виртуально) - Вы всегда знаете конкретный тип, который вы создаете, или конкретный класс статического метода. Вот почему нет смысла иметь абстрактный конструктор и абстрактный статический метод . Поэтому также нельзя указывать конструктор и статический метод в интерфейсах .

Можно даже представить конструктор как статический фабричный метод (и см. соответствующий образцы ):

  MyClass obj = new MyClass(); // the way it is
  MyClass obj = MyClass.new(); // think of it like this

Единственный случай, где было бы целесообразно определить абстрактный конструктор или абстрактный статический метод, будет, если используется отражение . В этом случае можно убедиться, что все подклассы переопределят соответствующий статический метод или конструктор. Но размышление - это другая тема...

Примечание : в таких языках, как Smalltalk, где классы являются обычными объектами, можно переопределить статический метод и иметь абстрактный конструктор. Но это не относится к Java, потому что классы не являются «обычными» объектами, даже если вы можете получить их с отражением.

-121--1112951-

Форматированный ввод для чего-либо, кроме основных типов (int, double и т.д.), не имеет большого смысла, и, возможно, только из них, когда берется из неинтерактивного потока, такого как istringstream. Так что вам, вероятно, не стоит реализовывать op > > в первую очередь, и, таким образом, не нужно беспокоиться о часовых объектах.

1
ответ дан 28 November 2019 в 05:45
поделиться
Другие вопросы по тегам:

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