【问题标题】:Determining whether a non-object variable is initialized in C++确定在 C++ 中是否初始化了非对象变量
【发布时间】:2010-10-05 18:33:02
【问题描述】:

所以,假设在 C++ 的一个类中,我有各种各样的成员变量。结构、字符串、整数等等等。可以是任何东西。这些变量可以或不能通过该类的对象的初始化来设置。给定 int a、float b、char c,有时可以全部设置或不设置。设置它们后,可以将它们设置为变量的任何可能值。我想找到某种设置方法,并确定是否设置了变量:

1) 大量选角。我总是可以创建一个具有布尔值的 Data_Value 装饰器类,并将其模板化为给定变量的任何内容。这需要调用 a_data_value.value 和 a_data_value.isInitialized。

2) 大量额外的布尔变量。我宁愿没有 bool a_initialized,bool b_initialized。

我真正想做的是这样的:

Python add to a function dynamically

在 C++ 中,带有任何和所有变量,包括原语。我知道的要求很高,我完全期待悲观的答案。

【问题讨论】:

  • 你对使用构造函数有问题吗?
  • 这个项目需要使用C++吗?如果动态语言(或具有内省的语言)更适合解决问题,也许最好的方法是使用一种。
  • 如果您能详细说明您为什么要这样做,或许我们可以提供替代解决方案。
  • 您是否有理由不能简单地在分配时初始化所有变量?
  • 您链接的 Python 问题似乎与这个问题没有任何关系。详细说明为什么它的相关性会很好。

标签: c++


【解决方案1】:

你是对的。无法在运行时确定原语是否“设置”。某些编译器会在某些使用未初始化值的情况下警告您,但这完全不能保证。

【讨论】:

  • ...因为所有原语都始终具有 some 值。它们没有有设置/非设置状态。实际上一个类或结构的所有数据成员也有这个属性,但是如果你需要的话,你可以内置一个 set-ness 标志。
  • @dmckee,这就是为什么“set”用引号引起来。具体来说,未初始化的变量具有不确定的值(第 8.5/11 节),并且无法确定值是否不确定。 :)
【解决方案2】:

我会使用可为空的模板。见http://www.codeproject.com/KB/mcpp/CNullable.aspx

【讨论】:

    【解决方案3】:

    假设你有

    class Bob {
     int a;
     int b;
     double c;
     complex<double> d;
     Bob () : a(), b(), c(), d() {}
    };
    

    当您创建一个新 Bob 时,所有内容都将设置为默认值(在这种情况下为零)。

    原始类型没有设置或未设置状态。它们总有一些价值。

    【讨论】:

      【解决方案4】:

      如果你想用 C++ 重写 Python,你可以。

      您需要一个以字符串为键的高效unordered_map 类。该字符串将是变量名。

      每个变量值都是一个类(称它为 VARIANT,呵呵),可以保存任何原始值。

      然后,您可以让您的“结构”成为您的 unordered_map aka dictionary 的一个实例,而不是 C++ 结构。

      如果在字典中找到变量名,则它已被设置,您可以返回该值。如果找不到,则永远不会设置。

      如果您打算在 C++ 中按名称引用字典键,您将希望使用以下内容来提高效率:

      代替:

      VARIANT v = dict["name"];
      

      用途:

      static const std::string name_key("name");
      VARIANT v = dict[name_key];
      

      这样,每次在函数中查找键时,不需要构建一个包含“名称”的 std::string,而是只完成一次。

      【讨论】:

        猜你喜欢
        • 2014-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 2017-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多