2013-06-13 2 views
0

유일한 생성자가 정수를 허용하는 클래스가 있습니다. 포인터를 만들고 new/delete를 사용하지 않고 다른 클래스에서 사용하고 싶습니다.다른 클래스의 사용자 정의 생성자로 클래스 선언하기

이것도 가능합니까? 일류의

요부 :

class A 
{ 
    private: 
    int size; 
    char *c; 

    public: 
    A(int i) 
    { 
    size = i; 
    c = new char[i]; 
    } 
    ~A() { delete[] c; } 
} 

다음과 같이 I는 예시적인 클래스 B에서 사용하려는 : ()를 사용하여 오브젝트의

class B 
{ 
    private: 
    A a(7); // Declaration attempt #1 
    A b; //Declaration attempt #2 
    A *c; //This is what I'll do if I have no other choice. 

    public: 
    B() 
    { 
    b = A(7); //Declaration attempt #2 
    c = new A(7); 
    } 
} 
+0

이 코드를 컴파일 : C에서

(11)는 균일 한 초기화를 사용할 수 있습니다 + +? 컴파일러는 뭐라고 말합니까? 당신이 놓친';'후에'}' – taocp

+0

# 1은 C++ 11과 # 2에서 작동합니다. 정말로 정말로 좋은 이유가 없다면'new'를 사용하지 마십시오. – chris

+0

@taocp : 나는이 이론 수업을 타이프하여 60 선반을 붙여 넣지 않고 묻는 부분을 좁히기 때문에 나는 단지 놀랐다. 잘못된! – SVC

답변

4

수준의 초기화는 불가능 왜냐하면 함수 선언으로 해석되기 때문입니다. 대신이 작업을 수행 할 멤버 이니셜 라이저 목록을 사용할 수 있습니다 는 양수인 대신를 초기화하기 때문에이 또한 권장 생성자하지만 멤버 이니셜 라이저 목록 내부 할당 작업을 할

class B 
{ 
    A a; 

    public: 
     B() : a(7) 
    //  ^^^^^^ 
     {} 
}; 

.

class B 
{ 
    A a{7};                 /* 
    ^^^^^^^                 */ 

    public: 
     B() = default; 
}; 
+0

예, 이것이 내가 필요한 것입니다! 고맙습니다! 이제 'A a1, a2'선언이 필요하다고 말하면서 어떻게 a1과 a2 둘 다 초기화 할 수 있을까요? – SVC

+0

@SVC'B() : a1 (5), a2 (6) {}'또는 C++ 11 :'A a1 {5}, a2 {6}; ' – 0x499602D2

+0

굉장 - 고마워요! – SVC

관련 문제