C ++ 클래스에서 정적 변수를 초기화 하시겠습니까?
클래스의 일부 함수가 실제로 객체에 액세스하지 않는다는 것을 알았으므로 static. 그런 다음 컴파일러는 액세스하는 모든 변수가 정적이어야한다고 말했습니다. 지금까지는 꽤 이해할 수 있습니다. 다음과 같은 문자열 변수가 많이 있습니다.
string RE_ANY = "([^\\n]*)";
string RE_ANY_RELUCTANT = "([^\\n]*?)";
수업에서 등등. 나는 static const그들이 결코 변하지 않기 때문에 그것들을 모두 만들었습니다 . 그러나 내 프로그램은 클래스 밖으로 이동하는 경우에만 컴파일됩니다. 그렇지 않으면 MSVC ++ 2010은 "정적 상수 정수 변수 만 클래스 내에서 초기화 될 수 있습니다."라고 불평합니다.
그것은 불행한 일입니다. 해결 방법이 있습니까? 나는 그들이 속한 수업에 남겨두고 싶습니다.
클래스 내부에서 초기화 할 수 없지만 소스 파일에서 클래스 외부에서 초기화 할 수 있습니다.
// inside the class
class Thing {
static string RE_ANY;
static string RE_ANY_RELUCTANT;
};
// in the source file
string Thing::RE_ANY = "([^\\n]*)";
string Thing::RE_ANY_RELUCTANT = "([^\\n]*?)";
최신 정보
나는 당신의 질문의 첫 번째 줄을 눈치 챘 - 당신이 하지 않는 이러한 기능을 만들고 싶어 static, 당신이 그들을 만들고 싶어 const. 그들을 만드는 것은 static그들이 더 이상 객체와 관련된 없음을 의미 (그래서 그들은 액세스 할 수없는 비 정적 멤버), 그리고이 유형의 모든 개체와 공유 할 데이터의 정적 수단을. 이것은 당신이 원하는 것이 아닐 수도 있습니다. 그들을 만드는 것은 const구성원을 수정할 수 없지만 여전히 액세스 할 수 있음을 의미합니다.
Mike Seymour가 정답을 제공했지만 추가하려면 ...
C ++를 사용하면 컴파일러에서 알 수 있듯이 정적 const 정수 유형 만 클래스 본문에서 선언하고 정의 할 수 있습니다 . 따라서 실제로 다음을 수행 할 수 있습니다.
class Foo
{
static const int someInt = 1;
static const short someShort = 2;
// etc.
};
다른 유형으로는이를 수행 할 수 없습니다.이 경우 .cpp 파일에서 정의해야합니다.
정적 멤버 변수는 클래스에서 선언 한 다음 외부에서 정의해야합니다!
해결 방법은 없으며 실제 정의를 소스 파일에 넣으십시오.
설명에 따르면 정적 변수를 올바른 방식으로 사용하지 않는 것처럼 보입니다. 변경되지 않는 경우 대신 상수 변수를 사용해야하지만 설명이 너무 일반적이어서 더 많은 것을 말할 수 없습니다.
정적 멤버 변수는 항상 클래스의 모든 인스턴스에 대해 동일한 값을 유지합니다. 한 개체의 정적 변수를 변경하면 다른 모든 개체에 대해서도 변경됩니다 (실제로 클래스의 인스턴스 없이도 액세스 할 수 있습니다. 즉 : 객체).
C ++ 11부터는 constexpr.
class stat {
public:
// init inside class
static constexpr double inlineStaticVar = 22;
};
이제 다음을 사용하여 변수에 액세스 할 수 있습니다.
stat::inlineStaticVar
정적 변수가 상수 변수와 동일하지 않다는 점을 추가 할 가치가 있다고 생각합니다.
클래스에서 상수 변수 사용
struct Foo{
const int a;
Foo(int b) : a(b){}
}
그리고 우리는 그렇게 선언 할 것입니다
fooA = new Foo(5);
fooB = new Foo(10);
// fooA.a = 5;
// fooB.a = 10;
정적 변수의 경우
struct Bar{
static int a;
Foo(int b){
a = b;
}
}
Bar::a = 0; // set value for a
그렇게 사용되는
barA = new Bar(5);
barB = new Bar(10);
// barA.a = 10;
// barB.a = 10;
// Bar::a = 10;
여기서 무슨 일이 일어나는지 봅니다. Foo가 인스턴스화되므로 Foo의 각 인스턴스와 함께 인스턴스화되는 상수 변수는 Foo의 각 인스턴스에 대해 별도의 값을 가지며 Foo에 의해 전혀 변경 될 수 없습니다.
Bar와 마찬가지로 Bar :: a에 대한 값은 Bar의 인스턴스 수에 관계없이 하나뿐입니다. 그들은 모두이 값을 공유하며 Bar의 모든 인스턴스로 액세스 할 수도 있습니다. 정적 변수는 또한 public / private에 대한 규칙을 준수하므로 Bar의 인스턴스 만 Bar :: a의 값을 읽을 수 있도록 만들 수 있습니다.
다른 답변 위에 추가하십시오. 복잡한 정적 멤버 를 초기화하려면 다음과 같이 할 수 있습니다.
평소와 같이 정적 멤버를 선언하십시오.
// myClass.h
class myClass
{
static complexClass s_complex;
//...
};
그렇게하는 것이 사소하지 않은 경우 클래스를 초기화하는 작은 함수를 만드십시오. 이것은 정적 멤버가 초기화 될 때만 호출됩니다. (complexClass의 복사 생성자가 사용되므로 잘 정의되어야합니다.)
//class.cpp
#include myClass.h
complexClass initFunction()
{
complexClass c;
c.add(...);
c.compute(...);
c.sort(...);
// Etc.
return c;
}
complexClass myClass::s_complex = initFunction();
목표가 헤더 파일에서 정적 변수를 초기화하는 것이라면 ( "header only"관용구를 고수하는 경우 원하는 * .cpp 파일 대신), 다음을 사용하여 초기화 문제를 해결할 수 있습니다. 주형. 템플릿 화 된 정적 변수는 여러 기호를 정의하지 않고도 헤더에서 초기화 할 수 있습니다.
예를 보려면 여기를 참조하십시오.
선택적으로 모든 상수를 .h 파일에 선언하지 않고 .cpp 파일로 이동합니다. 익명 네임 스페이스를 사용하여 cpp 모듈 너머로 보이지 않게 만드십시오.
// MyClass.cpp
#include "MyClass.h"
// anonymous namespace
namespace
{
string RE_ANY = "([^\\n]*)";
string RE_ANY_RELUCTANT = "([^\\n]*?)";
}
// member function (static or not)
bool MyClass::foo()
{
// logic that uses constants
return RE_ANY_RELUCTANT.size() > 0;
}
일부 답변은 약간 오해의 소지 가있는 것 같습니다 .
당신은 할 필요가 없습니다 ...
- 값 할당은 선택 사항 이므로 초기화 할 때 일부 정적 개체에 값 을 할당합니다 .
- Create another
.cppfile for initializing since it can be done in the same Header file.
Also, you can even initialize a static object in the same class scope just like a normal variable using the inline keyword.
Initialize with no values in the same file
#include <string>
class A
{
static std::string str;
static int x;
};
std::string A::str;
int A::x;
Initialize with values in the same file
#include <string>
class A
{
static std::string str;
static int x;
};
std::string A::str = "SO!";
int A::x = 900;
Initialize in the same class scope using the inline keyword
#include <string>
class A
{
static inline std::string str = "SO!";
static inline int x = 900;
};
참고URL : https://stackoverflow.com/questions/5019856/initialize-static-variables-in-c-class
'Nice programing' 카테고리의 다른 글
| 포착되지 않은 TypeError : 정의되지 않은 'linear'속성을 읽을 수 없습니다. (0) | 2020.11.06 |
|---|---|
| Jquery 양식 필드 값 가져 오기 (0) | 2020.11.06 |
| Chrome Fullscreen API (0) | 2020.11.06 |
| Xcode6에서 장치 콘솔을 얻는 방법은 무엇입니까? (0) | 2020.11.06 |
| Vim에서 강조 표시된 클래스 및 함수 이름 (0) | 2020.11.06 |