2011-02-03 2 views
1

이 프로그램을 실행하면 첫 번째 쌍의 값만 출력되는 것처럼 보이지만 다른 프로그램에서는 출력되지 않습니다. 무슨 일 이니?로컬 클래스 c-ism

#include <iostream> 
#include <vector> 

class a 
{ 
    public: 
     class b 
     { 
      public: 
       a* parent; 
       void test() 
       { 
        std::cout<<parent->value<<std::endl; 
       } 
     } b1; 
     unsigned long value; 
     a() 
     { 
      b1.parent = this; 
      value = 2; 
     } 
     void go() 
     { 
      value++; 
      b1.test(); 
     } 
}; 

int main() 
{ 
    { 
     a a1; 
     a1.go(); 
     std::cout<<a1.value<<std::endl; 
    } 
    std::cout<<std::endl; 
    { 
     a a1; a1 = a(); 
     a1.go(); 
     std::cout<<a1.value<<std::endl; 
    } 
    std::cout<<std::endl; 
    { 
     std::vector<a> a1; a1.push_back(a()); 
     a1.at(0).go(); 
     std::cout<<a1.at(0).value<<std::endl; 
    } 
    return 0; 
} 
+3

예상되는 사항은 무엇입니까? 왜 그걸 기대하니? 뭐하고 있니? –

+0

= 새 줄. 나는 기대하고있다. 3, 3,, 2, 3,, 2, 3입니다. 3, 3, 3, 3, 3, 3입니다. 그러나 a1이 만들어지는 방식 때문에, 나는 왜 그런지 알지 못한다. 그리고 나는 이런 방식으로 구축 할 수 있어야한다. – alan2here

+1

이들은 로컬 클래스가 아니며 * 중첩 된 * 클래스입니다. –

답변

2

'a'유형의 복사 및 대입 연산자가 없습니다. 따라서 객체를 복사하거나 할당 할 때 b1.parent를 제대로 업데이트하지 않습니다. 대신 b1.parent 값은 실제 부모와 다른 'a'객체를 가리 킵니다. 의 ctor를 사용하여 반드시 (

a() : b1 (this), value (2) {} // a change from your default ctor 
a(a const &x) : b1 (this), value (x.value) {} 
a& operator=(a const &x) { 
    value = x.value; 
    return *this; 
} 

그리고 수정 클래스 B : 클래스에게 수정

void go() { 
    value++; 
    std::cout << (this == b1.parent ? "as expected\n" : "uh-oh\n"); 
    b1.test(); 
} 

이 문제를 해결하려면 다음

, 액션에서이 문제를보고 기존 코드에서이를 사용하려면 초기화 도구) :

b(a *parent) : parent (parent) {} 
+1

'b1 (this-> b1)'~ –

+1

@ BlueRaja 님의 의견을 너무 많이 어 기고 있지만 실제로는 대답이 잘못되었습니다. 당신은'{b1.parent = this; }'를 수정하거나'class b '를 수정하십시오. –

+0

@Chris : 어, 잘 잡으세요 :) –

관련 문제