2011-08-29 5 views
0

저는 C++을 처음 접했지만 C에서 기본적인 메모리 할당 지식을 가지고 있습니다. 카드 번호와 클래스 Activity 객체 목록을 저장하는 클래스 Card를 작성하고 있습니다.개체를 초기화하고 다른 클래스에 저장해야 동적/정적으로 할당해야합니까?

class Card { 
    public: 
    Card(); 
    ~Card(); 
    vector<Activity> activities; 
    int cardNo; 
} 

현재, 나는 다음과 같은 코드를 사용하여 작업 개체를 초기화 :

Activity a = Activity("a"); 

및 카드 객체에 정의 된 벡터에 밀어 넣습니다.

하지만 사람들은 Activity * a = 새로운 활동 ("a") 대신 (동적 할당?)을 사용하여 초기화하는 경향이 있고 이전에 선언 된 (정적으로 할당 된) 객체는 함수 선언시 해제됩니다. 그들은 끝났다.

그런 다음 이전과 같은 방법으로 활동 개체를 초기화했지만 "새 카드()"방법으로 카드를 초기화하면 카드 개체가 해제되기 전에 활동 개체가 할당 취소되었을 수 있습니까? "새로운 활동()"을 사용하여 카드에 저장된 객체를 초기화해야합니까?

답변

1

아니요, 잘하고 있습니다. 객체를 vector에 푸시하면 복사가 수행됩니다. 따라서 함수가 반환 될 때 a은 파괴되지만 vector을 추가하면 여전히 별도의 복사본이 있습니다.

누군가가 클래스의 인스턴스를 동적으로 할당하고이를 벡터에 푸시하는 한 가지 이유는 특정 클래스의 객체를 복사하는 것이 비용이 많이 들며 (내부적으로 많은 복사를 수행하기 때문에 vector) 따라서 객체 대신 포인터를 저장하므로 객체가 아닌 포인터의 사본 만 만들어집니다 (거의 비싸지는 않습니다). 그것은 모두 클래스에 달려 있습니다. 일반적으로 성능 문제없이 객체의 벡터를 사용할 수 있습니다.

참고 : Activity a = Activity("a");에 대한 바로 가기 1Activity a("a"), 또는 더 나은, 벤자민은 무엇을 제안 할 당신이 그것을 밀어 전에 Activity에 대한 몇 가지 작업을 수행하지 않는 경우 activites.push_back(Activity("a"))을한다.

다른 단축키가 아니기 때문에 실제로는 지름길이 아니지만 의도와 목적에 따라 다릅니다.

+0

"활동을하기 전에 일부 작업을 수행"한다는 것은 무엇을 의미합니까? 게다가 생성자에 정의 된 연산? –

+0

@Eastenluis 예, 'Activity'에 대한 메소드 또는 무언가를 호출하기 전에 그것을 푸시하기 전에 생성하십시오. 'activites.push_back (Activity ("a"))'하면 분명히 할 수 없다. 'Activity a ("a")를 할 필요가 있습니다; a.some_method(); activities.push_back (a)' –

0

"(A") 대신 (동적으로 할당?) "

어떤 사람하지만 사람들은 활동 * A = 새 활동을 사용하여 초기화하는 경향이 발견"? 그들은 그것을 잘못하고있다. 너는 그렇게하고있어. 일종의.당신은 단지 대신이 작업을 수행 할 수 있습니다 : 당신이 포인터가 필요

activities.push_back(Activity("a")); 
0

몇 가지 경우 : 대신 일부 더미 상태의 NULL 수 있습니다

  • 는,
  • 공유 배타적이지 다형성 클래스에
  • 직접 구성원 변수를 방지하는 순환 종속성 또는 순환이 있습니다.

대부분의 STL 컨테이너와 마찬가지로이 특별한 경우 멤버 변수가 멤버 포인터보다 우선합니다.

관련 문제