这当然与其他已回答的问题有关,但是我无法从这些问题中得出针对我的具体情况的答案,主要是因为我实际上不是程序员。我只是一个工程师,碰巧不得不编写一些代码。

情况如下:

  • 我想收集一堆变量,可能是一个结构。
  • 除了两个我想初始化为零;需要将两个特定的变量(它们不是前两个变量)初始化为一个。
  • 实际名称是唯一且有意义的,以至于不适合使用 vector ,而且其中也有一些 double 。为了清楚起见,我将下面的示例保持简单。
  • 因为我正在从事的项目,所以我只能使用C++ 98,因此即使C++ 11具有更出色的解​​决方案,它们也无法为我工作。

  • 我正在为这些结构本身考虑以下方面:
    struct allFlags
    {
        int flagAA;
        int flagAB;
        int flagAC;
        int flagAD;
        int flagAE;
        // ...
        // there's about 100 variables total
        // ...
        int flagZZ;
    };
    

    我想将所有标志初始化为0,但flagADflagAE除外,应该为1。

    所以首先,我不确定是否应该使用typedef struct allFlagsstruct allFlags。接下来,我不确定是否应该创建一个构造函数(我认为仅在没有typedef的情况下才适用)还是在实例化结构时使默认设置发生。我已经看到过这样的事情(将其放入struct定义中):
        allFlags() : flagAD(1), flagAE(1) { /*not sure of I'd need anything here*/ }
    

    但我不想在构造函数主体中单独列出所有其他〜98个变量,以将它们设置为零。我也看到了使用memset的东西可能会有所帮助,但是我不确定做到这一点的最佳方法。

    最后,另一个相关的问题是如何实际声明我的结构实例(这将导致我想要的初始值)。看起来有时候structnew关键字实例化了,有时似乎更像是基本数据类型,即我在搜索中已经看到了这两种:
    allFlags flagset1;
    flagset2 = new allFlags;
    

    我还看到了这样的语法,而不是完全不用构造函数:
    allFlags flagset3 = {}; // to zero all fields first
    flagset3.flagAD = 1;
    flagset3.flagAE = 1;
    

    但我宁愿使实例化尽可能简洁明了。

    请原谅这个问题。在询问之前,我已经尝试过做作业,但是我的C++知识充其量只是中等水平,因此我发现一些看似相关的答案不是我完全理解,就是提出了更多问题。

    最佳答案

    如果您对使用模板感到满意,则可以使用类模板来自动清洁allFlags的所有成员变量。

    // class template to help initialize members cleanly.
    template <typename T>
    struct flag
    {
       // Constructors
       flag() : val(0) {}
       flag(T const& v) : val(v) {}
    
       // Automatic cast operators to T
       operator T& () { return val; }
       operator T const& () const { return val; }
    
       // Comparison operators
       bool operator==(flag const& rhs) const { return val == rhs.val; }
       bool operator!=(flag const& rhs) const { return val != rhs.val; }
       bool operator<(flag const& rhs) const { return val < rhs.val; }
    
       T val;
    };
    
    typedef flag<int> IntFlag;
    typedef flag<double> DoubleFlag;
    
    struct allFlags
    {
       // Initialize all flags bug flagAD to zero.
       allFlags() : flagAD(1) {}
    
       IntFlag flagAA;
       IntFlag flagAB;
       IntFlag flagAC;
       IntFlag flagAD;
       IntFlag flagAE;
       IntFlag flagZZ;
    };
    
    #include <iostream>
    
    int main()
    {
       allFlags f;
       std::cout << f.flagAA << " " << f.flagAD << std::endl;
    }
    

    输出:
    0 1
    

    关于c++ - c + + 98结构默认为零,除了一个值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43875319/

    10-11 22:57
    查看更多