2013-06-04 21 views
5

Bir nesneyi veya bir boş değeri döndüren bir işlev için isteğe bağlı yükseltmeyi kullanmaya çalışıyorum ve bunu anlayamıyorum. İşte şimdiye kadar sahip olduğum şey. Bu sorunun nasıl çözüleceğine dair herhangi bir öneri takdir edilecektir.destek kullanarak başarısız girişimi başarısız: isteğe bağlı

class Myclass 
{ 
public: 
    int a; 
}; 

boost::optional<Myclass> func(int a) //This could either return MyClass or a null 
{ 
    boost::optional<Myclass> value; 
    if(a==0) 
    { 
     //return an object 
      boost::optional<Myclass> value; 
     value->a = 200; 

    } 
    else 
    { 
     return NULL; 
    } 

    return value; 
} 

int main(int argc, char **argv) 
{ 
    boost::optional<Myclass> v = func(0); 
    //How do I check if its a NULL or an object 

    return 0; 
} 

Güncelleme:

Bu benim yeni kod ve ben İşleviniz aşağıdaki gibi görünmelidir value = {200};

class Myclass 
{ 
public: 
    int a; 
}; 

boost::optional<Myclass> func(int a) 
{ 
    boost::optional<Myclass> value; 
    if(a == 0) 
     value = {200}; 

    return value; 
} 

int main(int argc, char **argv) 
{ 
    boost::optional<Myclass> v = func(0); 


    if(v) 
     std::cout << v -> a << std::endl; 
    else 
     std::cout << "Uninitilized" << std::endl; 
    std::cin.get(); 

    return 0; 
} 

cevap

8

bir derleyici hatası alıyorum:

boost::optional<Myclass> func(int a) 
{ 
    boost::optional<Myclass> value; 
    if(a == 0) 
     value = {200}; 

    return value; 
} 

Ve sen 01'e basarak kontrol edebilirsin.:

boost::optional<Myclass> v = func(42); 
if(v) 
    std::cout << v -> a << std::endl; 
else 
    std::cout << "Uninitilized" << std::endl; 

Isnt bir = 200

Hayır, öyle değil mi> value- olacak. Boost.Optional.Docs Gönderen:

T const* optional<T (not a ref)>::operator ->() const ; 

T* optional<T (not a ref)>::operator ->() ; 
  • Gereksinimleri: * Bu başlatılır.
  • İadeler: İçerilen değere bir işaretçi.
  • Atar: Hiçbir şey.
  • Notlar: İhtiyaç BOOST_ASSERT() ile belirtilir.

Ve operator-> tanımı: Nesne başlatılmadı ise

pointer_const_type operator->() const 
{ 
    BOOST_ASSERT(this->is_initialized()); 
    return this->get_ptr_impl(); 
} 

, onaylama işlemi başarısız olacaktır. Biz

value = {200}; 

yazarken Biz Myclass{200} ile değerini başlatmak.


Not bu value = {200} başlatıcı listeleri için destek (C++ 11 özellik) gerektirir. argüman olarak int ile Myclass için

Myclass c; 
c.a = 200; 
value = c; 

Veya kurucu sağlamaktayız: derleyicinizin desteklemiyorsa, bunu şöyle kullanabiliriz

Sonra
Myclass(int a_): a(a_) 
{ 

} 

sadece yazabilirsiniz

value = 200; 
+0

'value = {200}' ile karıştırıldım '' Değer-> a = 200' olacak mı? – MistyD

+0

@MistyD, düzenlemeye bakın. – soon

+0

Düzenleme için teşekkürler.Ancak 'value = {200} ile' 'C2143 hatası 'derleme hatası derledim: sözdizimi hatası:' ' önce '{' ' – MistyD

İlgili konular