#c
#c
Вопрос:
Я создаю объект на основе параметра командной строки.
В C
Capture *cc = NULL;
if ( argv[2] == "capture" )
cc = new Capture(<some args>);
Теперь, чтобы использовать это в разных частях кода, должен ли я создать CaptureStub, содержащий фиктивные функции, чтобы к нулевому указателю никогда не обращались. Или есть более простой способ?
Спасибо
Комментарии:
1. -1. Опубликуйте код, который, по крайней мере, следует скомпилировать, чтобы мы не тратили время на исправление синтаксиса.
2. Я предполагаю, что здесь опечатка, и вы имели в виду Capture * cc
Ответ №1:
должен ли я создать CaptureStub, содержащий фиктивные функции
Вы имеете в виду шаблон Null Object? Да, это было бы прекрасно.
Или есть более простой способ?
Я не уверен, что есть более простой способ (шаблоны нулевых объектов — довольно хороший способ), но очень идиоматичный способ — проверить наличие NULL
if (cc != NULL)
{
// do something with cc
}
Ответ №2:
Во-первых, ваше if
условие никогда не будет истинным, поскольку ==
сравнивает адрес строкового литерала capture
со вторым аргументом командной строки. Вы захотите изменить его на что-то вроде strcmp("capture", argv[2] == 0)
или (string("capture") == string(argv[2]))
.
Во-вторых, я думаю, нам нужно продумать семантику того, что вы хотите. Каково желаемое поведение, если опция ‘capture’ не указана? Ничего не делать? Если нет, то, как упоминает @Doug T., шаблон Null Object является хорошим выбором, вместо того, чтобы усеивать ваш код сравнениями с null
.
Ответ №3:
Capture cc = NULL;
Тьфу, это не указатель прямо здесь. Если он компилируется, это потому, что класс Capture имеет неявный конструктор, который принимает значение int или указатель, или имеет operator=
.
Чтобы исправить это, используйте
Capture* cc = NULL;
После этого вы должны структурировать свой код таким образом, чтобы использовать объект только в том случае, если он инициализирован. Если это невозможно, то проверяйте каждый раз, прежде чем делать это.