【问题标题】:Array of Object - std::array - Constructor Initialization Problems对象数组 - std::array - 构造函数初始化问题
【发布时间】:2014-02-27 22:15:43
【问题描述】:

我正在编写一个周期表程序来帮助我理解类。 我希望能够通过几个属性来显示/排序元素,例如它是金属、非金属还是准金属。我不确定该怎么做,但我的第一个猜测是创建一个对象数组;但是,我在使用构造函数设置值时遇到问题。

class Element{
    public:
       enum class groupNames {  HYDROGEN, ALKALI, ALKALINE, GROUP_THREE, GROUP_FOUR, GROUP_FIVE,
                                GROUP_SIX, GROUP_SEVEN, GROUP_EIGHT, GROUP_NINE, GROUP_TEN,
                                GROUP_ELEVEN,GROUP_TWELVE, GROUP_THIRTEEN, GROUP_FOURTEEN,
                                GROUP_FIFTEEN, CHALCOGEN, HALOGEN, NOBLE_GAS
                                };
        enum class orbitals {ORBITAL_NOTSET, S_BLOCK, P_BLOCK, D_BLOCK, F_BLOCK};
        enum class metal_status {METAL = 0, METALLOID, NONMETAL};
        Element();
        Element(int aNumber, int pNumber,groupNames groupnames, metal_status MetalStatus, orbitals Orbital,std::string eName, std::string eSybol);
        void displayProperties();

    private:
        groupNames groupNumber;
        orbitals orbital;
        metal_status metalStatus;
        std::string elementSymbol;
        std::string elementName;
        int atomicNumber;
        int periodNumber;
};

Element::Element()
{
    atomicNumber = 0;
    periodNumber = 0;
    groupNumber = groupNames::HYDROGEN;
    metalStatus = metal_status::METAL;
    orbital = orbitals::ORBITAL_NOTSET;
    elementName = "NULL";
    elementSymbol = "NULL";
}

Element::Element(int aNumber, int pNumber,groupNames groupnames, metal_status MetalStatus, orbitals Orbital,std::string eName, std::string eSymbol)
{
    groupNumber = groupnames;
    metalStatus = MetalStatus;
    orbital = Orbital;
    atomicNumber = aNumber;
    periodNumber = pNumber;
    elementName = eName;
    elementSymbol = eSymbol;
}

void Element::displayProperties()
{
    std::cout << elementName << ", " << elementSymbol << "\n"
              << "Group Number: " << as_integer(groupNumber) << "\n"
              << "Metal Status: " << as_integer(metalStatus) << "\n"
              << "Orbital: "      << as_integer(orbital) << "\n"
              << "Atomic Number: "<< atomicNumber << "\n"
              << "Period Number: "<< periodNumber;
}

Previous Method of Initialization //工作正常,问题是我不能按属性排序

Element Hydrogen(1,1, Element::groupNames::HYDROGEN, Element::metal_status::NONMETAL, Element::orbitals::S_BLOCK, "Hydrogen", "H");
Element Helium(2, 1, Element::groupNames::NOBLE_GAS, Element::metal_status::NONMETAL, Element::orbitals::S_BLOCK, "Helium", "He");

std::array 方法 -- 问题!

std::array<Element, 115> Elements =
{
    Elements[0],
    Elements[1](1,1, Element::groupNames::HYDROGEN, Element::metal_status::NONMETAL, Element::orbitals::S_BLOCK, "Hydrogen", "H")
};

错误: 错误:不匹配调用 '(std::array::value_type {aka Element}) (int, int, Element::groupNames, Element::metal_status, Element::orbitals, const char [9], const char [2])'

【问题讨论】:

  • 您似乎在初始化所述数组时使用了未初始化的std::array 的元素。
  • 孤岛危机-对于其他人(如果我没记错的话)-您可以更正代码以删除对初始化列表中未初始化数组的引用吗?另外,小问题,但 enum 在您的代码中实际上被命名为 groupNames,但您将其称为 group - 就像我说的,小问题,但很高兴没有错误代码的问题。跨度>
  • 我可以换组。我有一个排版设置,当它添加到这里时我没有改变它。就阵列而言,这是问题的一部分。我不明白为什么我应该更正我的问题中的代码,因为它会导致以后可能遇到这个问题的人感到困惑。我也可能误会你了,这两天因为AP课,我睡了4个小时。

标签: c++ arrays c++11


【解决方案1】:

您可能需要两套牙套(我正忙着弄清楚clang 在抱怨什么。)我建议统一初始化。另外,我在您的枚举前面加上 Element 以作为限定符,并更改它们以匹配它们在您的类定义中的名称。

std::array<Element, 115> Elements =
{{
    {},
    {1,1, Element::groupNames::HYDROGEN, Element::metal_status::NONMETAL, Element::orbitals::S_ORBITAL, "Hydrogen", "H"}
}};

或者,您可以尝试:

std::array<Element, 115> Elements
{  
  Element(), 
  Element(1,1, Element::groupNames::HYDROGEN, Element::metal_status::NONMETAL, Element::orbitals::S_ORBITAL, "Hydrogen", "H")  
};

【讨论】:

  • 谢谢。我正要试试这个。我有一个 typedef 设置;这就是为什么我的代码说 group:: 和 metalStat::.
  • @Crysis 另外,您可以将as_integer 替换为static_cast&lt;int&gt;,因为enum class 的基础类型默认为int
  • 我是统一初始化的新手——你能解释一下为什么需要这两组花括号吗?
  • @remyabel 我试图弄清楚这一点,但我忘记了 staic casts,所以我使用了这个:template &lt;typename Enumeration&gt; auto as_integer(Enumeration const value) -&gt; typename std::underlying_type&lt;Enumeration&gt;::type { return static_cast&lt;typename std::underlying_type&lt;Enumeration&gt;::type&gt;(value); }
  • 谢谢。另外,我和@DanNissenbaum 有同样的问题
猜你喜欢
  • 2022-01-22
  • 2016-02-16
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
相关资源
最近更新 更多