Ссылки онлайн имеют довольно краткие и неопределенные описания на цели std::iostream::sentry
. Когда я должен интересоваться этим маленьким существом? Если это только предназначается, чтобы использоваться внутренне, почему обнародовали его?
Большинство людей никогда не будут писать код, в котором необходимо создавать часовые объекты. Часовой объект нужен, когда/если вы извлекаете данные из (или вставляете их в) буфера потока, который лежит в основе самого объекта потока.
Пока ваш оператор вставки/извлечения использует другие члены/операторы iostream для выполнения своей работы, ему не придется иметь дело с созданием часового объекта (потому что эти другие операторы iostream будут создавать и уничтожать часовые объекты по мере необходимости).
Он используется всякий раз, когда вам нужно извлечь или вывести данные с помощью потока. То есть всякий раз, когда вы создаете оператор >>
, оператор извлечения, или 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
просто пропускает пробел.
Если установлен 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 > > в первую очередь, и, таким образом, не нужно беспокоиться о часовых объектах.