在构造函数中初始化结构的数组成员

时间:2017-05-21 08:24:50

标签: arrays c++11

在这个例子中,来自The C ++ Programming Language第4版,第8章 我收到错误char[2] not assignablechar [5] not assignable。我正在使用clang 4.9。我错过了什么?

struct Address{
       string name;
       int number;
       string street;
       string town;
       char state[2];
       char zip[5];
       Address(const string n,int nu,const string & s,
                   const string& t,const string& st,int z);
};
Address::Address(const string n,int nu,const string & s,
                   const string& t,const string& st,int z)
     :name{n},
      number{nu},
      street{s},
      town{t}
{
  if(st.size()!=2)
        cout<<"state abbreviation should be two characters";
  state={st[0],st[1]};
  ostringstream ost;
  ost<<z;
  string zi{ost.str()};
  switch(zi.size()){
  case 5:
   zip={zi[0],zi[1],zi[2],zi[3],zi[4]};
  break;
  case 4:
   zip={'0',zi[0],zi[1],zi[2],zi[3]};
  break;
  default:
   cout<<"unexpected zip code format";
  }      
}

1 个答案:

答案 0 :(得分:0)

您不能对类似数组使用复制初始化。使用std :: array代替从初始化列表启用init。

还请注意可以描述的问题有多小,并且可以给出解决方案。您的示例代码中充满了针对该问题的无用语句,并且使得解决问题变得不容易!

另外作为提示,对于if语句块使用大括号通常是个好主意,在打印输出后使用endline并在类的标题中执行大部分工作以获得编译器优化器的全部功能。在不使用链接时优化器的情况下拆分为多个单元将降低性能并增加代码大小而不会带来任何好处。如果你有循环deps,拆分定义和声明是有意义的。但是,这也是一个品味问题...

#include <iostream>
#include <string>
using namespace std;

struct Address{
    //char state[2];
    std::array<char,2> state;
    Address( const string& st )
    {
        if(st.size()!=2)
        {
            cout<<"state abbreviation should be two characters" <<std::endl;
            return;
        }

        state={st[0],st[1]};
        std::cout << state[0] << state[1] << std::endl;
    }
};

int main()
{
    Address a{"AB"};
}