정적 멤버 변수를 사용하는 것이 좋습니다. 그러나 컴파일러는 "정수의 복사본을 만들고 최소값으로 초기화"하지 않습니다. .cc 파일에 각 파일에 대한 정의를 제공하고 거기에 0으로 초기화해야합니다. (C++ 11을 사용한다면 상황은 조금 다르지만 기본 아이디어는 같습니다.)
정적 멤버 대신 정적 글로벌 변수를 사용할 이유가 없습니다.
foo.h :
class Foo {
static int countCtor_;
static int countDtor_;
static int countprint_:
Foo();
~Foo();
static void print();
};
foo.cc :
#include <iostream>
#include "foo.h"
int Foo::countCtor_ = 0;
int Foo::countDtor_ = 0;
int Foo::countprint_ = 0;
Foo::Foo() {
++countCtor_;
// Something here
}
Foo::~Foo() {
++countDtor_;
// Something here
}
void Foo::print() {
++countprint_;
std::cout << "Ctor: " << countCtor_ << "\n"
<< "Dtor: " << countDtor_ << "\n"
<< "print: " << countprint_ << "\n";
}
당신이 기능을 많이 가지고하지만, 관련된 반복 조금 성가신-이 실수를하는 것은 매우 쉽다이다 ++ countBaz_를 할 때 ++ countBar_ (특히 상용구를 복사하여 붙여 넣는 경우) 정적 테이블과 카운트 [__ FUNC__]를 증가시키는 매크로와 같이 좀 더 멋진 것이 필요할 수 있으므로 사용하면됩니다. 각 기능에서 똑같은 라인. 이처럼 :
foo.H :
#include <map>
class Foo {
static std::map<const char*, int> counts_;
Foo();
~Foo();
void print();
};
foo.cc : 위 예 코드
#include <iostream>
#include "foo.h"
std::map<const char *, int> Foo::counts_;
#define INC_COUNT_() do { ++counts_[__FUNC__]; } while (0)
Foo::Foo() {
INC_COUNT_();
// Something here
}
Foo::~Foo() {
INC_COUNT_();
// Something here
}
void Foo::print() {
INC_COUNT_();
for (std::map<const char *, int>::const_iterator it = counts_.begin();
it != counts_.end(); ++it) {
std::cout << it->first << ": " << it->second << "\n";
}
}
는 __func__가 자리한다. 유감스럽게도, 그 자리에서 사용할 수있는 표준 호환 값은 없습니다. 대부분의 컴파일러에는 __func__, __FUNC__, __FUNCTION__, __FUNCSIG__ 및 __PRETTY_FUNCTION__의 하위 집합이 있습니다. 그러나 이들 중 어느 것도 C++ 03의 표준입니다. C++ 11은 __func__을 표준화하지만, "구현 정의 문자열"로만 사용됩니다.이 문자열은 유용하거나 고유하지 않을 수도 있습니다. 그 위에 다른 컴파일러에서 값이 달라집니다. 또한, 일부는 더 재미있게 만들기 위해 식별자가 아닌 매크로 일 수 있습니다. ":"
당신이, 당신은 문자열 (__ func__) + 같은 것을 사용할 수 있습니다 C++ 11에서, 진정한 휴대용 코드를 원하는 경우
+ STRINGIZE (__ LINE __)를 -이 다소 추한 것, 그러나 적어도 각 기능은있을 것이다 고유 한 이름. 그리고 C++ 03에는 이에 상응하는 것이 없습니다. "portable enough"만 있으면, 사용하는 모든 컴파일러의 문서를 참조하거나 autoconf와 같은 것을 의지하십시오.
메서드를 호출 할 때마다 증가하는 로컬 변수가있을 수 있습니다. – Brendan