switch内部的对象实例化(c++)

Object instantiation inside of switch revisited (c++)

本文关键字:c++ 实例化 对象 内部 switch      更新时间:2023-10-16

我理解在switch case或if条件中实例化的对象一旦离开该代码块将不再存在(如本问题所述)。但是,根据用户输入实例化对象的正确方法是什么?我相信大家可以从这个例子中看出我(笨拙地)想要做什么:

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都是新手。谢谢你的建议!

整体解决方案是对代码进行因子化。

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:
      {
          // ...
      }
    };
}

不要在一个函数中做所有的事情,而是将功能组件分离成不同的代码段,并在逻辑上组合它们。

在这种情况下,您应该使用多态性。

多态性有两种类型:

  1. Static,使用模板和编译过程中生成的对象
  2. 动态,使用继承,对象在运行时生成

各有利弊: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;
}

解决这个问题的一种方法是完全采用面向对象编程,并创建一个基类Element,然后创建继承Element的派生类triangle和tetrahedron。然后,您可以在switch语句中将Element实例化为三角形或四面体:

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

祝你好运!