2013-06-04 41 views
5

Tôi đã cố gắng sử dụng tăng tùy chọn cho một hàm có thể trả về một đối tượng hoặc một null và tôi không thể tìm ra nó. Đây là những gì tôi có cho đến nay. Bất kỳ đề xuất nào về cách giải quyết vấn đề này sẽ được đánh giá cao.thất bại khi sử dụng boost :: optional

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

Cập nhật:

Đây là mã mới của tôi và tôi nhận được một lỗi biên dịch tại 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; 
} 

Trả lời

8

Chức năng của bạn sẽ giống như sau:

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

    return value; 
} 

Và bạn có thể kiểm tra nó bằng cách truyền tới bool:

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

Isnt nó sẽ là giá trị gia tăng> a = 200

Không, nó không phải là. Từ Boost.Optional.Docs:

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

T* optional<T (not a ref)>::operator ->() ; 
  • Yêu cầu: * này được khởi tạo.
  • Trả về: Một con trỏ đến giá trị được chứa.
  • Ném: Không có gì.
  • Lưu ý: Yêu cầu được xác nhận qua BOOST_ASSERT().

Và trong định nghĩa operator->:

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

Nếu đối tượng không được khởi tạo, khẳng định sẽ thất bại. Khi chúng tôi viết

value = {200}; 

Chúng tôi khởi tạo giá trị với Myclass{200}.


Lưu ý rằng value = {200} yêu cầu hỗ trợ cho danh sách khởi tạo (tính năng C++ 11). Nếu trình biên dịch của bạn không hỗ trợ nó, bạn có thể sử dụng nó như thế này:

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

Hoặc cung cấp constructor cho Myclass với int như là đối số:

Myclass(int a_): a(a_) 
{ 

} 

Sau đó, bạn chỉ có thể viết

value = 200; 
+0

Tôi bối rối với 'value = {200}' Isnt nó sẽ là 'value-> a = 200'? – MistyD

+0

@MistyD, hãy xem bản chỉnh sửa. – soon

+0

Cảm ơn bạn đã chỉnh sửa.Nhưng với 'value = {200};' tôi nhận được lỗi biên dịch khi xây dựng 'lỗi C2143: lỗi cú pháp: thiếu ';' trước '{' ' – MistyD

Các vấn đề liên quan