2011-09-23 3 views
1

내가 간다 :C++ 객체 인스턴스화 및 (최근에) 범위

Phone myPhone = new Phone(); 

단순히

Phone myPhone; 

를 작성 본질적위한 홀더를 생성 클래스이지만 아직 초기화되지 않았습니다.

저는 C++로 작은 클래스를 작성하고 있습니다. 문제가 있습니다.

이 위의 코드와 같은 약간의 오해의 소지가 사실
Phone myPhone; 

void Initialise() 
{ 
    myPhone = new Phone(); 
} 

void DoStuff() 
{ 
    myPhone.RingaDingDong(); 
{ 

내가 하나에 많은 것들을 내 모든 초기화 코드를 삽입 할 수 있도록 원하기 때문에 내가하고 싶은 무엇인가 : 다음 의사 코드는 깔끔한 장소. 내 문제는 C++에서는 initialize 내부의 라인이 불필요하다는 것이다. 왜냐하면 그 전에는 새로운 인스턴스가 이미 만들어졌고 첫 줄에서 초기화되기 때문이다. 반면에 Initialise() 내부에 첫 번째 행을 넣으면 더 이상 DoStuff에서 액세스 할 수 없습니다. 범위를 벗어났습니다 (C++에서 'new'사용과 사용하지 않음의 차이는 말할 필요도 없음). 클래스 변수에 대한 홀더를 어떻게 만듦으로써 한 곳에서 초기화하고 다른 곳에서 액세스 할 수 있습니까? 아니면 근본적으로 잘못된 것이 있습니까?

미리 감사드립니다.

+3

답변을 작성하려고했지만 질문에 너무 많은 내용이 포함되어 있습니다. 대신 표준 SO C++ 응답 # 1 : [좋은 소개 서를 읽으십시오] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). –

+0

여기 CPP와 동의합니다. 언어의 한 가지 정비사를 아는 것이 한 가지 일이지만, 언어의 관용구를 이해하는 데에는 길게 걸립니다. 불행히도 당신의 예제는 너무 짧고 의미있는 조언을하기 위해 고립되어 있으므로 "새로운'또는 포인터"를 사용하지 말아야합니다. –

답변

2

Phone 생성자에 매개 변수가없는 경우 수명이 매우 간단합니다. 초기화 메소드에서 전화를 새로 시작할 필요가 없습니다.개체가 만들어지고 수명이 관리되면 사용자를 위해 만들어집니다.

매개 변수를 가져와야하고 Initialize() 메서드 또는 일부 설정 메서드가없는 경우 포인터 (null 일 수 있음)를 사용하고 Initialize() 호출이 필요할 수 있습니다 새로운 매개 변수를 전달하십시오. 포인터를 사용하기 전에 포인터가 null인지 확인해야합니다. 또한 평생 관리 (big 3 작성) 또는 C++ 11에서 shared_ptr과 같은 스마트 포인터를 사용해야합니다. 이것은 당신의 첫번째 선택이 아니어야합니다.

2

당신은 포인터에 새로운 연산자를 사용할 수 있습니다

Phone *myPhone; 

void Initialise() 
{ 
    myPhone = new Phone(); 
} 

void DoStuff() 
{ 
    myPhone->RingaDingDong(); 
} 

유일한 두 가지 변화가 myPhone의 선언에 추가 *-> 대신 . 있습니다 RinaDingDong()에 액세스 할 때. 또한 메모리 할당되어 new 이후를 해제해야합니다 : 당신이 할 경우이 myPhonePhone하지 실제 Phone에 대한 포인터 될 것

void destroy() 
{ 
    delete myPhone; 
} 

참고.

+0

아마도 OP가 진행될 것입니다. – Ramy

+4

실제로 필요하지 않는 한 원시 포인터 또는 무료 저장소를 사용하면 안됩니다. –

+0

굉장합니다. 여전히 포인터를 사용하여 조정, 지금은 예제에서 포인터가 많은 이유를 이해 해요. 한 가지 질문 - 나는 전화 myPhone 가정에 맞아. 컴파일러는 'delete'를 호출 할 필요가 없도록하기 위해 'new'내부에 내장 된 일종의 컴파일러를 가지고 있습니다. – SirYakalot

0

포인터에 약간 붓이 필요하다고 생각합니다. 포인터로 수행하려는 작업이 가능합니다.

제 문제는 C++에서는 initialize 내부의 라인이 불필요하다는 것입니다. 그 전에는 새 인스턴스가 이미 만들어지고 매우 첫 번째 라인에 의해 초기화되기 때문입니다.

올바르지 않습니다. 귀하가 제공 한 의견은 생성자에게만 도움이됩니다. puesdo 코드에서, initialize 함수는 전역 함수이며 클래스의 멤버 함수가 아닙니다.

반면에 Initialise() 내 첫 줄을 넣으면 더 이상 DoStuff에서 액세스 할 수 없습니다. 범위를 벗어났습니다 (C++에서 'new'사용과 사용하지 않음의 차이는 말할 필요도 없음).

포인터에 대한 책을 참조하십시오. 글로벌 포인터를 가지고 new으로 초기화 할 수 있습니다. doStuff에서 사용할 수 있습니다.

+2

나는 그가 "새로운 인스턴스가 이미 만들어졌다"고 말했을 때, 그는 이것을 언급하고 있었다 : "전화 myPhone; – quasiverse

0

C#을 사용하면 class와 struct라는 두 가지 유형의 객체가 있음을 알게됩니다.

클래스는 복사, 할당되고 참조로 함수로 전달됩니다. 따라서 그들은 참조 의미 체계를 사용하고 있습니다. 클래스도 힙에 할당됩니다 (new를 사용).

구조체가 값 복사 의미를 구현하고 있습니다. 구조체는 스택에 할당됩니다 (int, double 및 기타 기본 제공 유형은 구조체입니다). struct polymorphicaly는 처리 할 수 ​​없습니다.

C++에서는 이러한 차이점이 없습니다. 클래스와 구조체는 기본적으로 동일합니다 (일부는 기본 액세스 수준 임). 복사 의미론을 결정하는 것은 클래스의 선언이 아니지만 클래스에 대한 인스턴스의 선언입니다.

포인터를 만들면 동작이 C#의 클래스와 매우 유사합니다. 객체를 생성하면 의미론은 C#의 구조체와 유사합니다.

C++도 참고 자료입니다. 포인터와 참조의 차이점을 읽어야합니다.

0

케이트 그레고리의 대답은 맞지만 조금 더 자세히 설명하고 싶었습니다. C++에서 더 강력한 아이디어 중 하나는 스택에 할당 된 객체가 포함 된 범위에서 소유된다는 것입니다. 당신이 전화를 포함하는 클래스를 작성하려는 경우 예를 들어, 당신은 단지 이것을 쓰는 것 : 지금 장관이 작성 될 때마다

class Secretary { 
    Phone myPhone; 
}; 

을 그리고, 전화 개체가 자동으로 기본 생성자로 초기화됩니다. 더 중요한 것은 비서 객체가 파괴 될 때마다 그 객체에 포함 된 Phone 객체도 파괴된다는 것입니다. 당신이 전화에 대해 다른 생성자를 사용하려는 경우에는 장관의 생성자에서 초기화 목록을 사용할 수 있습니다 :이 경우 myPhone에서

class Secretary { 
private: // members 
    Phone myPhone; 
    Phone myCellPhone; 

public: // methods 
    Secretary() : myPhone("phone constructor", 12, " args") {} 
}; 

는 3 인수 생성자를 사용하여 초기화되며, myCellPhone는 다음과 같이 기본 생성자를 사용하여 초기화 보통의.

관련 문제