1

클래스에서 b 유형의 새 포인터를 선언하는 중 오류가 발생합니다. 도와주세요.새 키워드를 사용하여 forward 선언과 typename

#include <iostream> 

namespace B 
{ 
    class b; 
} 
class a 
{ 
    private: 

    B::b* obj_b; 

    public: 

    a(){} 
    ~a(){} 
    void create() 
    { 
     b* obj_b = new b; 
    } 
}; 
class b 
{ 
    private: 

     a *obj_a; 

    public: 
     b() 
     { 
      obj_a->create(); 
     } 
     ~b(){} 
}; 
int main() 
{ 
    b obj; 

    return 0; 
} 
+2

나는 많은 코드를 보지 못했습니다. 너 뭔가 잊은거야? – bk1e

+0

및 이름을 변경하십시오. 더 많은 키 스트로크는 해를 끼치 지 않을 것입니다 – Chubsdad

답변

1

코드에 많은 오류가 있습니다. 이는 전방 선언, 정규화 된 이름 사용 등과 관련이 있습니다.

namespace B 
{ 
    class b; 
} 
class a 
{ 
private: 

    B::b* obj_b;   // change 1 (fully qualified name) 

public: 
    void create();   // change 2 (can't use b's constructor now as B::b is not 
          // yet defined) 
    a(){} 
    ~a(){} 

}; 

class B::b     // change 3 (fully qualified name) 
{ 
private: 

    a *obj_a; 

public: 
    b() 
    { 
     obj_a->create(); 
    } 
    ~b(){} 
}; 

void a::create()    // definition of B::b's constructor visible now.  
{ 
    B::b* obj_b = new B::b; // And here also use fully qualified name 
} 

int main() 
{ 
    B::b obj; 

    return 0; 
} 
+0

감사합니다. 미안 해요, 이거 처음이에요. – pandoragami

+1

@scriptingalias : 질문하는 것에 대해 사과하지 마십시오. – manneorama

6
b* obj_b = new b; 

그리고 문제가있다. 포인터는 모두 같은 크기이기 때문에 B에 대한 포인터를 선언 할 수 있지만 클래스 정의를 컴파일러에 제공하지 않으면 값으로 하나를 만들거나 값을 취할 수 없습니다. 알 수없는 유형의 메모리를 할당하는 방법을 어떻게 알 수 있습니까?

+0

그래요, 제가 처음 줄에 쓴 것은 맞지만 지금은 고마워요 – pandoragami

+0

글쎄요, 네가 잘못했음을 깨달았다. –

+0

그 (지금, 명백한) 대답에 감사드립니다! –