2013-08-23 2 views
4

일부 정적 데이터로 클래스를 만들었습니다. 이런 식으로 뭔가 :벡터가 제대로 객체를 생성하지 않습니다.

class Object 
{ 
public: 
    Object(); 
    Object(Point center, double area); 
    Object(int cx, int cy, double area); 
    ~Object(); 
    //and other public stuffs here... 
private: 
    Point center; 
    double area; 
    static double totalArea; 
    static int objCounter; 
    static double areaMean; 
}; 

을 그것의 생성자와 소멸자보다가 내가 만든 :

Object::Object() 
{ 
    this->setCenter(Point()); 
    this->setArea(0.0); 
    objCounter++; 
    totalArea += 0; 
    areaMean = totalArea/objCounter; 
} 
/*this is just the default constructor I 
have two others that increment real area, not 0*/ 

Object::~Object() 
{ 
    //cout << "Destructor called!\n"; //put it just to test 
    objCounter--; 
    totalArea -= this->area; 
    areaMean = totalArea/objCounter; 
} 

그래서 내 의도가 만든 얼마나 많은 객체 알고 있었다, 그것은 전체 면적과 평균 영역이다.

Object first; 
Object second; 
cout << Object::getObjCounter() << "\n"; 
///I have the get method implement origanally 

그리고 모든 것이 괜찮아 : 나는 간단한 같은 문장으로 테스트. 객체 클래스 수는 스태틱의 수를 올바르게 나타냅니다. 간단한 배열을 사용하여 테스트했습니다 :

Object test[ 10 ]; 
cout << Object::getObjCounter() << "\n"; 

놀라운 ... 그것은 작동합니다. 동적 할당 테스트 :

Object *test = new Object[ 10 ]; 
cout << Object::getObjCounter() << "\n"; 
delete [] test; 

다시 ... 작동합니다. 그러나 내가하려고하면 그것은 나에게 표준 출력 제로를 제공

vector<Object> test(10, Object()); 
cout << Object::getObjCounter() << "\n"; 

... 나는 그것이 일어나는 이유를 생성자와 소멸자에 플래그를 넣어. 그리고 그것은 내가 벡터 문을 사용할 때, 생성자가 소멸자가 순차적으로 호출되는 것보다 단지 호출된다는 것을 보여줍니다 !!!! 왜???? 나에게 이해가 가지 않는다! 아무도 나에게 이것을 설명 할 수 있 었는가? 또한, 누구든지 벡터를 사용하여 단순한 배열과 동일한 효과를 얻을 수있게 도와 줄 수 있습니다. 즉, 무언가 안에 많은 개체가 있고 올바르게 계산하고 있습니까? 것은 요소 제거 및 추가, 크기 조정과 같은 벡터 기능이 필요하지만 휠을 재발견하고 싶지는 않습니다. 미리 감사드립니다.

+0

벡터 생성자가 벡터 생성자를 복사 생성합니다. 'Object()'인수도 필요 없습니다. – chris

+0

기본 생성자에서'totalArea + = 0;'을 수행하는 점은 무엇입니까? – Blastfurnace

+0

Object()는 단지 기본 생성자입니다. 저는 totalArea + = 0에 효과적인 생성자와 비슷한 코드를 넣었습니다. –

답변

10

Object 클래스의 복사 생성자를 정의해야합니다. http://www.cplusplus.com/articles/y8hv0pDG/

+1

표시된 클래스에 대해 자동 생성 된 기본값이 해당 통계를 업데이트하지 않으므로 최대 투표, 복사 생성자가 매우 중요합니다. http://stackoverflow.com/questions/3378533/whats-all-the-fuss-about-c-copy-constructors –

+0

감사의 그것은 매력처럼 일했습니다! 하지만 왜 그런지 이해하지 못했습니까? 벡터는 하나의 객체를 만들고, 다른 객체를 복사하여 만들고, 생성 된 첫 번째 객체를 파괴합니다. 그렇습니까? –

+1

@HugoOshiro 당신의'Object()'인자가 범위를 벗어나면 ctor을 한번 호출하고 dtor를 호출한다고 생각합니다. 벡터는이 임시 객체에 대해 여러 번 copy ctor를 호출합니다. –

4

sudopunk 정확히 맞으면 복사 생성자가 필요합니다. 그러나, 그것은 또한 세의 규칙을 따라 복사 할당 연산자를 정의하는 좋은 방법이 될 것입니다 : 생성자를 복사하거나 할당 연산자를 복사, 당신은 소멸자 중 하나가있는 경우

을 명시 적으로 세 개를 모두 선언해야 그들. 여기

당신이 그들을 정의 할 방법은 다음과 같습니다, 생성자를 복사 다른 곳에 할당 된 회원/자원이있는 클래스에 대한 매우 중요한 할당 연산자와 소멸자를 복사

Object& operator=(const Object& rhs); 
Object(const Object&); 

주 - 동적에 힙. 암시 적 복사 생성자와 대입 연산자는 객체의 멤버 전용 복사본 만 수행합니다.

또 다른 최적화는 이동 의미을 적용하는 것이지만 다른 이야기이며이 스레드의 범위를 벗어납니다.

+1

세 가지 중 하나를 사용하고 싶지 않다면, 그것을 private으로 선언 할 수 있습니다. 이 경우에 구현을 제공 할 필요는 없으며, 컴파일러에게 자신이 만든 (잘못된) 버전을 만들고 싶지 않으며 아무도 호출하지 않아야한다고 컴파일러에게 알립니다. 이 클래스의 각각의 클래스에 대해 네 개의 다른 함수 (소멸자 포함)를 올바르게 작성해야한다는 번거 로움은 내 눈에서 C++의 최악의 설계 오류 중 하나입니다. – cmaster

관련 문제