2009-11-06 9 views
0

여기에 문법으로 어려움을 겪고 있습니다.이 질문은 v 간단합니다.매우 간단한 C++ oop 질문

특히, 내가 둥지 그래서 다른 클래스 내에서 클래스의 경우 예를 들어

class a 
{ 
    a //the constructor 
    { 
     b an_instance_of_b // an instance of class b 
    } 
}; 

class b 
{ 
    public: 
    foo() 
    { 
     cout << "foo"; 
    } 
}; 

내가이 수행하여 B에서이 방법을 액세스하려고 :

a an_instance_of_a; //declare an instance of a 
an_instance_of_a.an_instance_of_b.foo() 

^^이 나던 것을 일하다. 이것은 단순화되었습니다 (어딘가에 오타가 될 수도 있음). 하지만 클래스가 잘 설치되어 있다는 것을 알고 있습니다. 클래스가 중첩되어 있다면 클래스 내부의 메소드에 액세스 할 수 없습니다. 나는 무엇을 잘못하고있을 수 있는가?

많은 감사.

답변

3

an_instance_of_b은 a의 멤버가 아니며 a의 생성자에있는 로컬 변수입니다 (그리고 생성자 선언에 괄호가 없습니다).

여기서 일어날 일은 a의 인스턴스를 만들면 즉시 b의 인스턴스를 만들고 파기 한 다음 a에 대한 생성자를 남겨두고 인스턴스가 만들어집니다.

+0

그것은 참으로 문제이었다! 나는 몇 가지 해결책을 시도했지만 결국 (후손을 위해 여기에 게시) : 가장 쉬운 방법은 실제로 클래스 a의 클래스 b에 대한 포인터를 만든 다음 주 함수에서 호출하는 것입니다 (-> 연산자 사용). 적절한) – ohnoitslateandiwanttosleep

0

다른 클래스에 중첩 된 클래스가 표시되지 않습니다.

클래스 "b"가 시작되기 전에 클래스 "a"끝이 괄호 - 세미콜론으로 표시됩니다. 따라서 중첩 할 필요가 없습니다.

편집 나는 수업/끝 시작 위치를 명확하게하기 위해 코드를 포맷 한

.

당신은 a의 생성자는 기본적으로 비공개입니다 b an_instance_of_b

후 세미콜론 누락되었습니다. 제 생각에는 public 생성자가 필요합니다. 그들은 당신의 예에 중첩하지 않는,

class B; // prototype declaration 

class hello { 
    hello() { //the constructor 
     B an_instance_of_b; // an instance of class b 
    } 
}; 

class B { 
public: 
    void foo() { 
     cout << "foo"; 
    } 
}; 

첫째 :

class b; // forward declare "b" so that it is valid in class "a" 

class a 
{ 
    public: 
    a(void) //Constructor is now public. 
    { 
     // Empty body. There is now a member variable 
    } 

    public: 
     b a_member_instance_of_b; 
}; 

class b 
{ 
    // Note: no constructor. 
    public: 
    foo() 
    { 
     cout << "foo"; 
    } 
}; 

int main(void) 
{ 
    a an_instance_of_a; 
    an_instance_of_a.a_member_instance_of_b.foo(); 
    return 0; 
} 
+0

lol. 나는 잠들뿐입니다! 나는 이름에 대해 내 마음을 중반 바꿨다. a와 b이어야합니다. 사과. 나는 참으로 애처 롭다 – ohnoitslateandiwanttosleep

1

이 시도 :

EDIT 2

나는 이것이 당신이 원하는 코드라고 생각합니다. 어쨌든 그렇게 할 필요가 전혀 없습니다.

둘째, 일부 기능 및 데이터 선언 오류가있었습니다.

마지막으로 선언이 순방향 참조로 작동 할 수 있도록 B이라는 프로토 타입이 필요합니다. 또는 B 앞에 hello을 선언하십시오.

1

이 리눅스 ++ g와 나를 위해 작동 : 내가 생각하고

#include <iostream> 

using namespace std; 

class B { 
public: 
     void foo() { 
       cout << "foo" << endl; 
     } 
}; 

class A { 
public: 
     B b; 
}; 

int main() { 
     A a; 
     a.b.foo(); 
} 

B는 귀하의 경우 개인 수 있습니다.

1

&을 실행하는 정확한 코드를 게시 해보십시오. 불필요한 기능은 없앨 수 있지만 위의 코드는 컴파일되지 않으므로 문제를 해결하기가 매우 어렵습니다.

an_instance_of_b는 (는) 찌르다가 기본값으로 보호됩니다. 그렇습니까? 즉, 수업 외부에서 액세스 할 수 없게됩니다. 또한 게시 된 코드로 판단하면 an_instance_of_b도 클래스 변수가 아니며 생성자 내의 로컬 변수입니다. 인스턴스를 검색하려면 Getter를 추가해야합니다. 어쩌면 이것과 같은 것입니다. (잠시 C++을 해본 적이 없습니다.)

class ClassA 
{ 
    public: 
    hello() { _ClassB = new ClassB(); } 
    ClassB GetClassB() { return _ClassB; } 
    private: 
    ClassB _ClassB; 
} 

class ClassB 
{ 
    public: 
    foo() {} 
} 

void SomeRandomFunction() 
{ 
    ClassA classA = new ClassA(); 
    classA.GetClassB().foo(); 
}