2017-05-21 1 views
-1

이 C++ 프로그래밍 언어의 제 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"; 
    }  
} 
+0

취향의 문제이다 (https://stackoverflow.com/help/mcve)! 예 : 'zi' 정의가 아직 표시되지 않았습니다. – javaLover

+2

여기에 불완전한 코드가있는 것은 좋지 않습니다. 게다가 내부 클래스 초기화를 검사하기 위해 왜 수많은 매개 변수를 제공해야합니까? 작은 코드 스 니펫을 제공해주세요! – Klaus

+0

나는 앞에서 약간 불완전한 코드를 게시 한 것을 인정하지만, 관련성이 있지만 혼란 스럽다는 것을 알기 전에 최선을 다했습니다. http://stackoverflow.com/questions/4057948/initializing-a-member-array-in-constructor-initializer – mage

답변

0

C와 같은 배열에는 복사 초기화를 사용할 수 없습니다. 대신 이니셜 라이저 목록에서 init을 활성화하는 std :: array를 사용하십시오.

문제가 설명 될 수 있고 해결 방법이 주어질 수 있음을 유의하십시오. 당신은 예제 코드가 그 문제에 대한 쓸데없는 진술로 가득 차서 문제를 이해하기 쉽지 않습니다!

또한 힌트로 if 문 블록에 중괄호를 사용하고 인쇄 후 endline을 사용하고 클래스 헤더에서 대부분의 작업을 수행하여 컴파일러 최적화 프로그램을 최대한 활용하는 것이 좋습니다. 링크 타임 옵티 마이저를 사용하지 않고 여러 단위로 나누면 성능이 떨어지고 이점없이 코드 크기가 커집니다. 순환 정의가있는 경우 정의와 선언을 분리하는 것이 좋습니다. 그러나 예, 그것은 ... 또한 내가 [MCVE]의 비명

#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"}; 
} 

~

+0

내가 준 코드는 Bjarne Stroustrup의 책 "The C++ programming language, 4th edition"에서 거의 그대로 나온다. "cout 부분"제외. 그래서 코드가 주어진대로 작동해야한다고 생각합니다. 나는 또 다른 접근법을 제안했다. 그러나 이것이 정확하거나 불완전한 것인지 알고 싶습니다. – mage

+0

@mage 언급 한 책에 버그가있는 예가 있습니다. 무엇 때문에? :-) "그래서 코드가 주어진대로 작동해야한다고 생각합니다." 아니! ;) 전문가들도 실수가 없다는 것을 알게 될 것입니다. 그것은 점점 더 복잡한 세상의 대가입니다. 그리고 다시 책을 질문에 복사 할 필요가 없습니다. 코드 스 니펫을 단순화하십시오. – Klaus

+0

그래서'state = {st [0], st [1]} '예제에서 사용되지 않았고 책에서 진짜 오류가 있습니까? @ 필자는 구조, 멤버 변수 태그가 질문과 관련 있다고 생각한다. – mage

관련 문제