C создание объекта на основе условия

#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;
  

После этого вы должны структурировать свой код таким образом, чтобы использовать объект только в том случае, если он инициализирован. Если это невозможно, то проверяйте каждый раз, прежде чем делать это.