简体   繁体   English

对象数组-std :: array-构造函数初始化问题

[英]Array of Object - std::array - Constructor Initialization Problems

I'm writing a periodic table program to help me understand classes. 我正在编写一个周期表程序来帮助我理解类。 I want to be able to display/sort the elements by several properties such as whether it's a metal, nonmetal, or metalloid. 我希望能够通过多种属性来显示/排序元素,例如它是金属,非金属还是准金属。 I'm not sure hwo to do it, but my first guess was to create an array of objects; 我不确定该怎么做,但是我的第一个猜测是创建一个对象数组。 however, I'm having problems using my constructor to set the values. 但是,使用构造函数设置值时遇到问题。

Class

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 //Works fine, the problem is I can't sort by properties 以前的初始化方法 //工作正常,问题是我无法按属性排序

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 Method -- Problem! 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")
};

Error: error: no match for call to '(std::array::value_type {aka Element}) (int, int, Element::groupNames, Element::metal_status, Element::orbitals, const char [9], const char [2])' 错误:错误:与“(std :: array :: value_type {aka Element})的调用不匹配(int,int,Element :: groupNames,Element :: metal_status,Element :: orbitals,const char [9],const字符[2])'

You may need two sets of braces (I was pulling my hair out figuring out what clang was complaining about.) I suggest uniform initialization. 您可能需要两套牙套(我正在拉出头发,弄清楚什么是lang铛声。)我建议统一初始化。 Also, I prefixed your enums with Element for qualification and changed them to match what their names are in your class definition. 同样,我为您的枚举添加了Element资格,并对其进行了更改以使其与您的类定义中的名称匹配。

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

Alternatively, you can try: 或者,您可以尝试:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM