【问题标题】:How to define variable of unknown type global in if/else sequence?如何在 if/else 序列中定义未知类型的全局变量?
【发布时间】:2015-05-25 13:44:59
【问题描述】:

我有 3 个课程:

class A
{
   //
};
class B
{
   //
};
class C
{
   //
};

如何定义类型等于此类之一的变量 q 并使其成为全局变量?

  • 我只需要一个实例,而且只需要一次。
  • 所有这些类都有方法 set() 和 search(),它们对每个类都有不同的作用。
  • 我从命令行获得了“a”的值。

例如,我将这样定义它,q 不会是全局的。

if (a == 1) {
    A q;
} else
if (a == 2) {
    B q;
} else
if (a == 3) {
    C q;
} else

【问题讨论】:

  • 在这种情况下,您需要预处理器 (#ifdef),或者使用接口和引用(因为 ABC 目前不相关..
  • 您能否edit your question please,更具体地了解您的实际用例?您在运行时是否只需要这些全局实例之一?更多,但仅限于特定类型?这些类是否通过声明的成员函数和变量完全不同?请先明确您的要求。
  • 请查看我的回答。如果您确实不需要您请求的此功能的任何运行时配置支持,它可能会有所帮助。
  • 最后,您应该清楚这一点,如果您需要在编译时或运行时做出决定或ABC

标签: c++ class types scope definition


【解决方案1】:

您可能希望为 A、B、C 提供一个通用基类并利用工厂设计模式。

class A : public Base
{
};

class B : public Base
{
};

class C : public Base
{
};

class ABCFactory
{
public:
 static Base* Create(int index)
 {
    switch (index) 
    {
      case 1:
    return new A;
      case 2:
    return new B;
      case 3:
    return new C;
    };
 }
};

//example usage:
std::unique_ptr<Base> p = ABCFactory::Create(1);

【讨论】:

  • 您的答案一切正常,尽管有一点:请使用std::unique_ptr&lt;Base&gt; 而不是原始指针和new()
  • 是的,首先我使用了 Base*,因为我很确定 OP 无法使用它 - 但后来,我决定编写正确的版本 :)
  • 我只是想把它放在工厂类本身。不过很好,至少你提到了。
【解决方案2】:

如何定义类型等于此类之一的变量 q 并使其成为全局变量?

  • 我只需要一个实例,而且只需要一次。
  • 所有这些类都有方法 set() 和 search(),它们对每个类都有不同的作用。

在这种情况下,您可以考虑使用预处理器通过程序的编译时配置来实现此目的

#define CHOOSE_CLASS 1 // Or use -D option for the compiler in the build system
#if (CHOOSE_CLASS == 1)
A q;
#else
#if (CHOOSE_CLASS == 2)
B q;
#else 
#if (CHOOSE_CLASS == 3)
C q;
#endif
#endif
#endif

或模板类包装器来选择其中之一

class A;
class B;
class C;

enum TypeSelector {
    CLASS_A ,
    CLASS_B ,
    CLASS_C ,
};

template <TypeSelector selection>
struct SelectFinal {
     typedef void FinalType;
};

template<>
SelectFinal<CLASS_A> {
     typedef A FinalType;
};

template<>
SelectFinal<CLASS_B> {
     typedef B FinalType;
};

template<>
SelectFinal<CLASS_C> {
     typedef C FinalType;
};

SelectFinal<CLASS_A>::FinalType q;

如果您需要在运行时选择类类型,则需要使用另一个答案中描述的工厂模式。也许稍作修改:

class ABCFactory {
public:
    static std::shared_ptr<Base> Create(int index) {
        static std::shared_ptr<Base> theInstance;
        if(!theInstance.get()) {
             switch (index) {
             case 1:
                 theInstance = std::make_shared<A>();
                 break;
             case 2:
                 theInstance = std::make_shared<B>();
                 break;
             case 3:
                 theInstance = std::make_shared<C>();
                 break;
             }
         }
         return theInstance;
     }
 };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多