Необязательный экземпляр класса

0

Привет, я пытаюсь сделать что-то вроде следующего.

Если некоторые переменные переданы из строки cmd, т.е.

 const char * outputtype1
 const char * outputtype2

Последний может быть NULL.

Затем я хочу создать экземпляр класса, если outputtype2 задан в командной строке. Как я могу добавить экземпляр этого класса. то есть.

 if(outputtype2)
 {
 cats thomas(outputtype2);
 }

Затем я использую это позже, как

thomas.eatfood(whiskers);

Это то, где он расстраивается. Очевидно, что thomas не существует, если outputtype2 является нулевым, но почему я не могу это сделать?

 if (outputtype2) 
 {
 cats thomas(outputtype2);
 }

без ошибок "thomas" не был объявлен в этой области. Я боюсь, что здесь отсутствует основное правило.

  • 0
    Что ты на самом деле пытаешься сделать?
  • 0
    Объявить cats thomas вне if объема.
Показать ещё 8 комментариев
Теги:
oop

3 ответа

2
Лучший ответ

Если я понимаю ваш вопрос, проблема в том, что вы создаете экземпляр класса в области if. Позже вы пытаетесь вызвать метод eatfood объекта thomas, но объект не существует в текущей области.

Может быть, вы хотите это сделать...

if (outputtype2) {
  cats thomas(outputtype1);
  thomas.eatfood(whiskers);
}

Или используйте указатель...

Cats* thomas = NULL;

if (outputtype2) {
  thomas = new Cats(outputtype1);
}

if (thomas != NULL) {
  thomas->eatfood(whiskers);
}
  • 0
    Мне нравится это решение (нулевой указатель), не могли бы вы объяснить строку: thomas = new (outputtype1); Разве это не нужно спецификатор типа
  • 0
    @ user3512203 Вы, очевидно, правы! Я отредактировал свой пост.
5

Вероятно, вам понадобится boost::optional<cats>. Это позволяет вам определить thomas спереди и назначить cats(outputtype2) на thomas тогда и только тогда, когда они доступны.

Следствием этого является то, что при любом использовании thomas вам нужно будет проверить, на самом деле он был назначен.

  • 0
    Я думаю, что вы получили опечатку там ..
  • 1
    @NeilKirk: У вас достаточно репутации, и на ТАК вам не нужно спрашивать разрешения, чтобы исправить эти вещи.
Показать ещё 1 комментарий
0

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

if(outputtype2)
 {
 cats thomas(outputtype2);
 }

это означает, что переменная thomas существует только в блоке, в котором она объявлена. Вне нее thomas больше не существует, и объект, и ссылка уничтожаются, когда элемент управления покидает блок. Поэтому вы не можете использовать их снаружи!

Найдите другую логику для написания вашей программы.

  • 0
    Он спрашивает, какой будет эта логика.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню