Наиболее ключевые элементы в легком [закрытом] стандарте кодирования C++

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

31
задан 5 revs, 2 users 100% 8 August 2012 в 01:51
поделиться

38 ответов

Удостоверьтесь, что деструкторы определяются как виртуальный :

 class GoodClass {
 public:
   GoodClass();
   virtual ~GoodClass()
 };

 class BadClass {
 public:
   BadClass();
   ~BadClass()
 };
0
ответ дан 27 November 2019 в 21:19
поделиться

Вид функционирует в объявлениях класса и определениях по имени. Это помогает определить местоположение их в .cpp файле. Кроме того, это освобождает Ваш ум, потому что Вы не должны думать о том, куда поместить Вашу новую функцию.

-7
ответ дан 27 November 2019 в 21:19
поделиться

Я думаю, что кодирующий стандартный документ не является решением этой проблемы. Решение состоит в том, чтобы заставить Вашу работу изучать/заботиться о человеческой стороне кодирования - "кодируют для людей сначала и компьютеров в последний раз".

, Очевидно, не возможно просто уволить тех, которые не заботятся - но стандартный документ не собирается помогать им очень, также.

1
ответ дан 27 November 2019 в 21:19
поделиться

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

Так, чтобы повторно подчеркнуть: непротиворечивость - соглашение о присвоении имен, пробельное управление, комментируя блоки, структуру каталогов. Ничто иное действительно вопросы

Редактирование для Dustin: большая проблема со стандартами идет с исключениями. Если у Вас есть стандарт, в котором говорится "1 оператор на строку", Вы не можете записать следующий искусственный пример:

SetColText(1,"col1"); SetColWidth(1, 10);
SetColText(2,"col1"); SetColWidth(2, 10);
...
SetColText(9,"col1"); SetColWidth(9, 10);

, Но я сказал бы, что это было более читаемым, и поэтому менее подверженным ошибкам что разделение их. (Я уверен, что можно придумать лучшие примеры).

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

Вы видите некоторые стандарты, которые продолжаются для страниц и страниц. (Philips C# каждый - 48 fecking страниц долго!)

Так, учитывая, что у Вас есть команда качественных кодеров, что необходимо сделать, чтобы помочь работать с их кодом? ответ всегда является непротиворечивостью того, 'куда' они помещают код, не, как они пишут это. например, у Вас всегда есть мусорное ведро, и obj каталог в Вашем проекте является хорошим стандартом. Можно забрать любой проект и знать, где вещи.. в отличие от кого-то создающего все его двоичные файлы в его c:/mybin каталоге, потому что его более легкое для него.

0
ответ дан 27 November 2019 в 21:19
поделиться

Я предлагаю просто требовать, чтобы разработчики считали набор инструкций, и эффективный C++ и более эффективные книги C++ Meyers.

, Если Вы хотите легкий вес, Вы оказываетесь перед необходимостью полагаться на здравый смысл и общий идеал.

обзоры Кода помогают осуществить это также.

Для хранения этого легким я избежал бы полиции документа и кода. Похвалите хороший код публично.

РЕДАКТИРОВАНИЕ - я запустил с комментария здесь, но помещу его в ответ для простоты просмотра:

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

Удостоверяются, что сохранили документ маленьким и убедились привести ПРИЧИНЫ для "правила" / инструкция. Без этого затем Вы один просто требовательное слепое повиновение. С объяснением и причинами Вы обучаете так, чтобы на самом деле регистрация/запись "правила" стала ненужной. (поскольку понятие будет усвоено)

1
ответ дан 27 November 2019 в 21:19
поделиться

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

-2
ответ дан 27 November 2019 в 21:19
поделиться

Ограничьте типы, которые Вы используете

, Если необходимо использовать целый тип, выбрать один и сохранить его. Это избежит проблем, связанных со смешиванием коротких, международных, долго, и т.д. типы.

// BAD
int i ;
long j ;
short k ;

// GOOD (if you choose the "int" as integer)
int i ;
int j ;
int k ;

то же идет для реальных типов: Выберите один (например, дважды) и не используйте другого.

И т.д.

Примечание: существует все еще проблема со знаком/неподписанных, которых нельзя всегда избегать, и факт использование STL его собственные целые типы (т.е. станд.:: вектор:: size_type), но весь остающийся код не должен, смешиваясь.

Примечание 2: Вы могли использовать определение типа для "выбирания" предпочтенного типа для целых чисел со знаком и вещественных чисел. Это включило бы недорогое изменение в случае необходимости.

, Как это ясно упрощает более безопасный код, который минимизирует риск загадочных ошибок, который увеличивает пригодность для обслуживания и т.д.?

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

Компиляторы обычно отправляют предупреждения во время компиляции, но затем, обычно ответ должен "выбросить" предупреждение, которое может помочь скрыть ошибку.

Редактирование

постамент сделал полезный комментарий, я скопирую вставку здесь:

записавший много кода, который должен взаимодействовать с вещами на аппаратном уровне, я не могу свидетельствовать в пользу этой инструкции. Для этого уровня работы я предпочитаю, чтобы целочисленные типы были абстрагированы к именам, которые включают точность (т.е., int16, uint16, int32, uint32, и т.д.) †“постамент 18 августа в 20:50

, постамент является правильным, конечно. Иногда необходимо иметь дело с int16, uint8 и другие "точно определенные" типы.

Это не делает недействительным сообщение выше, только завершает его.

источник ошибки смешивает различные типы (преобразовывающий неподписанный символ в интервал, например), таким образом, этого вида смешивания нужно избежать. Следующие правила таким образом применяются:

  • Выбирают один универсальный целочисленный тип (например, интервал) и придерживаются его при контакте с универсальными целыми числами (то же может быть сказано о реалах)
  • (и только если) при необходимости в точных типах (как uint8 или int16), используйте их
  • Никогда различные типы соединения.
  • , Если действительно необходимо смешать различные типы, затем быть очень очень осторожными.

Ниже пример кода, который повредился бы:

void * doAllocate(uint32 i)
{
   // try to allocate an array of "i" integers and returns it
}

void doSomething()
{
   uint32 i0 = 225 ;
   int8   i1 = 225 ;  // Oops...

   doAllocate(i0) ;   // This will try to allocate 255 integers
   doAllocate(i1) ;   // This will TRY TO allocate 4294967265
                      // integers, NOT 225
}
0
ответ дан 27 November 2019 в 21:19
поделиться

Книга об искусстве программирования {1,2,3}

0
ответ дан 27 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

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