2011-10-24 4 views
8

아주 새로운 프로그래머와 어리석은 질문에 대한 사전 사과.런타임에 할당 후 읽기 전용 인 변수?

내 배열의 길이가 내 구조의 일부 여야하는지 결정하는 데 사용하는 변수에 int 변수가 있습니다. 나는 내 머리글에 const int으로 그것을 사용했습니다. 지금, 주어진 변수에 다른 값을 부여하기 위해 프로그램을 포크 화하고 싶지만 런타임에 할당 한 후에는 읽기 전용으로 유지하고 싶습니다.

몇 가지 아이디어가 필요했습니다. 선호하는 방법이 있습니까?

  1. 내 헤더에 const int *을 선언하고 내 주요 기능에 const int에 할당,하지만 거추장스러운 것 같다.
  2. 내 주요 기능으로는 평야로 int으로 지정하십시오.
  3. 함수가 호출 될 때 변수를 인수로 전달하십시오.
  4. 내가 아직 생각하지 않은 것.
+0

이 변수를 사용하여 런타임에 가변 크기의 배열을 만드는 경우 Standard C++가 아닙니다. 표준 C++에서는 ** 가변 길이 배열 (VLA) **을 사용할 수 없습니다. 따라서 배열의 길이는 컴파일 시간 상수 여야합니다. –

+0

@Als : 길이가 일정한 배열을 만들었지 만 런타임까지 길이가 얼마인지 모르겠습니다. –

+1

@BlueMagister : 그렇다면 그들은 길이가 일정하지 않습니다. 이 문맥에서 "상수"는 "컴파일 타임 상수"를 의미합니다. 'new'로 배열을 할당하지 않는다면) 배열을 C++에서 비 컴파일 타임 크기로 지정할 수 없습니다.'std :: vector'를 사용하거나'new'로 그것을 할당해야합니다. –

답변

9

저는 함수형 정적 변수와 간단한 함수를 사용합니다. 관찰 :

int GetConstValue(int initialValue = 0) 
{ 
    static int theValue = initialValue; 
    return theValue; 
} 

이것은 함수 수준의 정적 변수이므로 처음 시작될 때만 초기화됩니다. 따라서 initialValue 매개 변수는 함수를 처음 실행 한 후에는 쓸모가 없습니다. 따라서 함수의 첫 번째 호출이 함수를 초기화하는 호출인지 확인해야합니다.

0

나는 당신이 원하는 것이 말이되지 않는다고 말하고 싶습니다. 상수는 이 아닌 값을 변경하는 것이지 값을 한 번 또는 두 번 변경하는 것이 아닙니다. 전역 변수를 원한다면, 그것을 일정하지 않게 만드십시오.

한편 스코프 상수 값이있는 경우 일반 C++ 지침에 따라 가능한 한 사용 사이트에 가까운 것으로 선언하기 위해 동시에 값을 선언하고 초기화하면됩니다. 여기

for (auto it = v.begin(), end = v.end(); it != end; ++it) 
{ 
    const Foo & x = *it; 
    const std::size_t n = x.get_number_of_bars(); 

    // use x and n ... 

    const bool res = gobble(x, zip(n)); 
    if (res && shmargle(x)) { return 8; } 
} 

컴파일러도 그 가치가 이미 다른 수단을 통해 알려진 모든 경우에 변수에 대한 특별한 코드를 생성하지 않도록 선택할 수 있습니다 : 예를 들어, 다음 로컬 범위에서 상수의 사용을 표시합니다.

+1

런타임에 한 번 변수를 지정하는 방법을 찾고 있었으나 이후에는 변경할 수 없습니다. –

1

정확한 값을 정확히 알고 계십니까? 파일이나 어떤에서 읽는다면, 당신은 말을 바로 할 수 있습니다 : 당신이 정말로 당신의 지능은 한 번만 할당되어 있는지 확인하려면

const int n = determine_correct_value(); 
+0

전달 된 인수에서 올바른 값을 알고 있습니다. 그러나이 구성은 의미가 있습니다. 내 코드를 바이올린하고이 코드가 작동하는지 확인하겠습니다. –

+2

당신은'argv'를 의미합니까? 죄송합니다. 전역은 제어 흐름이'main'으로 들어가기 전에 초기화됩니다. – fredoverflow

6

C++이를위한 내장 솔루션을 가지고 있지만하지 않습니다 당신은 자신의 특별한 int 클래스를 만들 수 있습니다 :

class MyConstInt 
{ 
public: 
    MyConstInt(): assigned(false) {} 
    MyConstInt& operator=(int v) 
    { 
     assert(!assigned); 
     value = v; 
     assigned = true; 
     return *this; 
    } 
    operator int() const 
    { 
     assert(assigned); 
     return value; 
    } 
private: 
    int value; 
    bool assigned; 
}; 


MyConstInt mi; 
// int i = mi;   // assertion failure; mi has no value yet 
mi = 42; 
// mi = 43;  // assertion failure; mi already has a value 
int* array = new int[mi]; 
+0

대신 'MyConstInt' 대신'MySettings'라는 개념을 사용합니다. 또한 가치로 구성 할 수있는 아이디어가 될 것입니다. –

+0

@Mooing Duck : 사실,하지만 가능한 가장 단순한 구현을 보여주고 싶었습니다 (예를 들어 값 유형에 템플릿을 적용하는 것도 좋은 아이디어 일 것입니다). – imre

+0

나는 그것도 좋은 생각이라고 생각한다. 'static '함수보다 낫다. 감사! –

관련 문제