2014-01-22 3 views
-4

특정 클래스를 사용하여 생성 된 개체의 양을 알 수있는 기능을 얻고 싶습니다.클래스에서 생성 된 개체 수를 카운트하십시오.

내가 시도 다음

에서 MyClass.h

class myClass { 
private: 
    static int internalCounter; 
    int id; 
public: 
    myClass(): id(internalCounter) {internalCounter++;} 
} 

문제는 C++이 허용하지 않습니다, 나는이 문제를 해결하는 방법을 잘 모르겠어요 것입니다. 나는 대답이 같은 제안하는 SA에 비슷한 질문 보았다 :

myClass::internalCounter = 0; 

을하지만 구문 수준이 권리를 생각하지 않습니다.

+0

"지금은 이것을 허용합니까?" –

+0

@duffymo : 참조 횟수가 아니라 각 개체의 고유 한 식별자처럼 보입니다. –

+0

왜 그렇게 많은 downvotes? –

답변

2

당신은 구현 파일에

int myClass::internalCounter = 0; 

로 정적 변수를 정의해야합니다.

2

다른 제안은 거의 옳았습니다. 이 같은 필요

int myClass::internalCounter = 0; 

을하지만 그것은 소스 파일 (* cpp를)보다는 헤더에 갈 필요가있다. 헤더 파일 자체의 선언을 다른 방법으로 인스턴스화하지 않기 때문에 해당 행이 필요합니다. 이를 소스 파일로 해석하면 특정 번역 단위 내에서 선택되고 인스턴스화됩니다.

2

당신은 정적 변수를 정의해야합니다 구현 파일에

int myClass::internalCounter=0; 

를, 그 항상 최고의 g의 경우 컴파일러/링커 출력을 읽을 수 있도록 ++는 다음과 같습니다

main.cpp:(.text.startup+0x2): undefined reference to `myClass::internalCounter' 

undefined reference 수단 정의되지 않았습니다. 이것은 코드에서 수정해야하는 것에 대한 힌트입니다.

5

C++ 입니다. 하지만 정적 변수는 정의가 필요하며 누락 된 것처럼 들립니다. 정적 변수가 제로 초기화 기본적으로이 있기 때문에 당신은 소스 파일 (안 헤더)

int myClass::internalCounter = 0; 

= 0은 선택에 넣고해야합니다,하지만 당신은 명시하는 것을 선호 할 수도 있습니다.

+0

고마워요! 나는 몇 분 안에 대답을 수락 할 것이다. –

0

어쨌든 카운터를 소스 파일에 넣어야하므로 클래스의 정의를 가져 와서 익명의 네임 스페이스 영역에 넣는 것이 좋습니다. 그러면 헤더 파일에서 클래스의 구현 세부 사항 중 일부가 필요합니다.

C++ 11에서 작업하는 경우 int 대신 atomic_int을 사용하십시오.

사후 증가 연산자를 사용하여 작업을 적절하게 원자 적으로 만듭니다.

myClass시간

class myClass 
{ 
    private: 
    int id; 

    public: 
    myClass(); 
    // etc 
}; 

MyClass.cpp를

#include <atomic> 
#include "myClass.h" 

namespace { 
    static std::atomic_int internalCounter; 
} 

myClass::myClass() 
    : id(internalCounter++) 
{ 
} 

는 스레드 안전 있도록 이름, 원자, 제안에 atomic_int에 operator++ 사후 증가가있다.

관련 문제