2012-10-06 42 views
1

我有一個任務來學習如何使用boost :: variant。我試圖創建一個函數,要求用戶創建一個形狀類型。然後創建所需的形狀並將其分配給變體並將其返回。我正在使用一個開關來完成這個任務,但是我得到了一個運行時錯誤和默認語句。Boost:創建一個返回變量的函數

我也得從編譯器警告:「警告C4715:‘ShapeVariant’:不是所有的控制路徑返回一個值」

如何我只是如果用戶輸入一個無效的選擇打印字符串?

謝謝!

#include "boost/variant.hpp" 

typedef boost::variant<Point,Line,Circle> ShapeType; 

ShapeType ShapeVariant() 
{ 
    cout << "Please select a Shape Type\n1: Point\n2: Line\n3: Circle\n\nSelection: "; 

    int choice; 

    cin >> choice; 

    switch(choice) 
    { 
    case 1: return Point(); break; 
    case 2: return Line(); break; 
    case 3: return Circle(); break; 
    default: cout << "Invalid selection." << endl; break; 
    } 
} 

回答

3

不是從函數中打印一個字符串,而是拋出一個異常,調用者捕獲並打印引發異常的原因。

switch(choice) 
{ 
    case 1: return Point(); break; 
    case 2: return Line(); break; 
    case 3: return Circle(); break; 
    default: throw std::runtime_error("Invalid selection."); 
} 

在來電:

try { 
    auto result = ShapeVariant(); 
} catch(std::exception const& e) { 
    std::cout << e.what() << std::endl; 
} 
+0

完美!非常感謝! –

0

您不能在C++中執行此操作,運行此類代碼將導致無效情況下的未定義行爲。如果選擇確實無效,則拋出異常。您也可以查看boost::optional,這是專爲這種情況設計的。