C ++-де NULL-ді қайтару үшін қосымша күшейтуді қалай пайдалануға болады?

Менде кейбір жағдайларда NULL функциясын қайтаруға қажет функция бар және осы функцияның қайтару мәнін тексеру үшін басқа функция бар. Мен оптималды екенін білемін, бірақ синтаксисті қалай пайдалану керектігін білмеймін.

Төменде аталған пайдаланудың қарапайым мысалы болар еді:

int funct1(const string& key) {
 //use iterator to look for key in a map
  if(iterator == map.end()) {
    return NULL//need help here!
  else
    return it->second;
}

void funct2(string key) {
  if(funct1(key) == NULL) {//<-- need help here!
   //do something
  } else {
   //do something else
  }

Кейбіреулер синтаксисте көмек сұрай алады ма?

Рахмет.

9
Сіз 10 сұрақ қойдыңыз және 0 жауап алдық. Сіз кері оралып, дұрыс жауаптарды қабылдаңыз.
қосылды автор Mark Ingram, көзі

3 жауаптар

Ол сіз орнатқанша « NULL » күйінде қалады. Сіз бұл идиоманы пайдалана аласыз:

optional funct1(const string& key) {
 //use iterator to look for key in a map
  optional ret; 
  if (iterator != map.end()) 
  {
    ret =  it->second;
  }

  return ret;
}

Сонда:

if (!funct1(key)) { /* no value */ }
14
қосылды

Сұраққа түспес бұрын бірнеше нәрсені айтайын.

Егер жол әрдайым табылса (бағдарламашының қатесі болмаса), ол міндетті емес, орнына түспеуі мүмкін. Пайдаланушы енгізуі болса да, тіпті тырысыңыз/ұстаңыз/тастағыңыз келуі мүмкін.

Егер сіздің сынып семантикасы сияқты контейнерді имитациялайтын болса, ол end жөнелтушісін пайдаланып, ол табылмады, нөл емес екенін көрсету керек.

If however returning a null representation is what you're after, your function return type would be boost::optional and the null return would be return boost::none;.

3
қосылды
Марк Марк Б. - Неліктен сіз өзіңізге міндетті түрде қайта оралғыңыз келгенін қаламайсыз, неге қайтуды ұсынамыз? Айырмашылық бар ма? Егер бар болса, қайсысы кәсіби кодының параметрінде артықшылығы бар? Менің кодым басқа пайдаланушылардың пайдалана алатын кітапханасы болуға арналған, сондықтан пайдаланушыға кіріске негізделген кодта тырысып көріңіз/ұстап/тастаңыз? Рахмет.
қосылды автор czchlong, көзі
Сондай-ақ, boost :: none пайдалануды ұсынамын, себебі ол оқылуды арттырады (менің пікірімше).
қосылды автор Luc Touraille, көзі

Мынаны көріңіз:

int funct1(const string& key)
{
 //use iterator to look for key in a map
  if(iterator == map.end())
    return boost::optional();
  else
    return boost::optional(it->second);
}

void funct2(string key)
{
  const boost::optional result = funct1(key);
  if (result.is_initialized())
  {
   //Value exists (use result.get() to access it)
  } 
  else
  {
   //Value doesn't exist
  }
}

Мен сондай-ақ, үлгі жасауды жеңілдету үшін:

typedef boost::optional OptionalInt;
1
қосылды
Boost.Optional құжаттамасында is_initialized қолданылмайды; оның орнына bool түрлендіру операторын қолданыңыз (мысалы: if (result) {...} ). Сондай-ақ, funct1 қайтару түрі int болмауы керек.
қосылды автор ildjarn, көзі