switch内部的对象实例化(c++)
Object instantiation inside of switch revisited (c++)
我理解在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:
{
// ...
}
};
}
不要在一个函数中做所有的事情,而是将功能组件分离成不同的代码段,并在逻辑上组合它们。
在这种情况下,您应该使用多态性。
多态性有两种类型:
- Static,使用模板和编译过程中生成的对象
- 动态,使用继承,对象在运行时生成
各有利弊: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;
}
祝你好运!
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 对显式实例化的模板函数的未定义引用
- [temp.variadic]中关于包扩展实例化的措辞