2014-07-17 28 views
1

如果一個代碼塊已經離開(如this question中所述),我不確定在開關實例內部實例化的對象或if條件將不再存在。但是,什麼是根據例如實例化對象的正確方式?用戶輸入?我相信,人們可以從什麼我看到的例子(笨拙地)試圖做:重新訪問開關內部的對象實例(C++)

class triangle 
{ 
public: 
    static const int dimension = 2; 
}; 

class tetrahedron 
{ 
public: 
    static const int dimension = 3; 
}; 

template<class T> 
class element 
{ 
    public: 
    int getDimension() 
    { 
     return T::dimension; 
    } 
}; 

int main() 
{ 
    int elementType; 
    std::cout<< "Enter 1 for triangle or 2 for tet: " 
    std::cin >> elementType; 

    switch(elementType) 
    { 
    case 1: 
     { 
      element<triangle> myElementFile; 
      break; 
     } 
    case 2: 
     { 
      element<tetrahedron> myElementFile; 
      break; 
     } 
    } 
    // I want to use myElementFile further, but it does not exist here 
    std::cout<< "The dimension is: " << myElementFile.getDimension(); //this won't work 
    return 0; 
} 

我不知道是否使用類作爲「容器」,用於存儲有關不同元素信息的總體方針然後喂他們到一個不同的班是最佳的,但我現在應該堅持下去,因爲我被告知。 :)我一般是新來的c + +和OOP。謝謝你的提示!

回答

1

這是你應該使用多態性的情況。

有兩種類型的多態性:

  1. 靜態的,在您使用模板和編譯
  2. 過程中生成的對象
  3. 動態,讓您使用繼承和對象是在運行時生成

兩者都有優點和缺點:http://www.cpptutor.com/static-polymorphism-and-dynamic-polymorphism-in-c++.htm

對你的靜態方法在Kerrek SB的答案中有很好的解釋。

如果你想創建一個對象,並保存它供以後,我比較推薦使用動態方法:

enum Elements { 
    triangle = 1, 
    tetrahedron = 2 
} 

class Element { 
    public: 
     virtual int getDimension() = 0; 
} 

class Triangle : public Element { 
    virtual int getDimension() { return 1;} 
} 

class Tetrahedron : public Element {   
    virtual int getDimension() { return 4;} 
} 

int main() 
{ 
    Elements elementType; 
    std::cout<< "Enter 1 for triangle or 2 for tet: " 
    std::cin >> elementType; 


    Element* element = NULL; 
    switch(elementType) 
    { 
    case triangle: 
      element = new Triangle(); 
      break; 
    case tetrahedron: 
      element = new Tetrahedron(); 
      break; 
    default: 
      element = new Tetrahedron(); 
      break; 
    }; 

    std::cout << "The dimension is: " << element->getDimension() << "\n"; 
    delete element; 

} 
+0

+1比我的更完整的答案! – Steger

+1

因爲'element'是一個指針,我不必使用'element-> getDimension()'而不是'element.getDimension()'?這樣,並且在類定義之後包含分號後,我才能正常工作。 – FliegenderZirkus

+0

你是對的,我爲這個錯誤感到抱歉 –

3

整體解決方案是考慮你的代碼。

template <typename T> 
void process_thing(T const & t) 
{ 
    std::cout << "The dimension is: " << t.getDimension() << "\n"; 
} 

int main() 
{ 
    switch (condition) 
    { 
    case Triangle: 
     { 
      process_thing(element<triangle>()); 
      break; 
     } 
    case Tetrahedron: 
     { 
      process_thing(element<tetrahedron>()); 
      break; 
     } 
    default: 
     { 
      // ... 
     } 
    }; 
} 

不要在一個函數中做所有事情,而是將功能組件分離成不同的代碼段併合理地組合它們。

0

解決此問題的一種方法是完全支持面向對象的編程,並創建一個基類Element,然後創建派生類繼承Element的三角形和四面體。然後,您可以將元素實例化爲switch語句中的三角形或四面體:

// define base class and derived classes here -- 
// any good book on oo programming will guide you. 
// 

int main() 
{ 
int  choice = 1; 
Element *element; 

switch (choice) 
{ 
case 1: 
    element = new Triangle(); 
    break; 

case 2: 
    element = new Tetrahedron(); 
    break; 
} 

// do stuff with element here: 
std::cout << "Element has " << element.dimensions << "dimensions!" << std::endl; 

delete element; 
return 0; 
} 

祝您好運!