2011-08-23 5 views
2

C++에서는 전체 클래스를 공유하기 위해 런타임에 프로그래밍 방식으로 초기화해야하는 복소수 배열이 단 한 번만 있습니다. 그것들은 정적이거나 일정 할 수 있습니다. 어떻게 그들을 초기화 할 수 있습니까? 나는 현존하는 parrallel 프로세서의 엄청난 인기와 함께 정적을 사용하지 않았다. 그래서 플래그를 한 번 실행하도록 설정해야합니까? 아니면 함수 (ok) 또는 클래스 (ok)에 대한 변수로 초기화 할 정적 정적 마술이 있습니까? 내가 NUMTRACES을 반복없이 검색 할 수 있도록 이미 sumOfWeights로 나누어 각각 이중으로 weightAtI에게 조회를하고 싶습니다 위의 코드에서 클래스 변수 배열을 프로그래밍 방식으로 초기화해야합니다. 어떻게해야합니까?

double sumOfWeights = 0.0; 
    double fracObs = 0.0; 
    for (int i = 0; i < NUMTRACES; i++) { 
     double weightAtI = SQUARED(1 - SQUARED(MAXTRACEWRTMIDTRACE * (MIDTRACE - i) 
             /double(MIDTRACE))); 
     sumOfWeights += weightAtI; 
     fracObs += obsArray[i] * weightAtI; 
    } 
    return fracObs/sumOfWeights; 

.

_ 편집 _ 그것은 그 생성자는 그냥 흥정에 내 정적, const를 초기화 그렘린를 해결하기 위해 희망 :) 위한거야, 괜찮아. 감사합니다 세스

_ 편집 _ 는 그래도 원하는 확실히 효과가 확실하지. 멤버가 정적 인 경우에도 생성자는 각 인스턴스에서 실행됩니다. 제 맞쳐은 볼 ...

는 _ 편집 _ 내가 가장 효율적인 솔루션은 생성자에서, 정적 플래그로 초기화 루프를 보호하는 것입니다 생각. POD 깃발이기 때문에 나는 그것이 적절하게 행동해야한다고 확신합니다, 나는 그것이 현 단계에서 무엇인지 확실히 확신하지 못합니다. 이

static const int MIDTRACE = 3; 
    static const int NUMTRACES = 2 * MIDTRACE + 1; 
    static double WEIGHTATI[NUMTRACES]; 

, 내 코드에 관해서 불행하게도, 내가 얻을 _ 편집 _

class X 
{ 
public: 
    static int i; 
}; 
int X::i = 0; // definition outside class declaration 

:

_ 편집 _ 아, 그것을 가지고 링커 오류 :

meobj.obj : 오류 LNK2020 : 해결되지 않은 토큰 (0A00001C) "개인 정적을 두 번 * 망 : meclass :: PIMPL :: WEIGHTATI"(? WEIGHTATI @ PIMPL @ meclass 망 @ @@ $$ Q0PANA) meobj .OBJ : 오류 LNK2001 : 확인되지 않은 외부 기호 "개인 정적을 두 번 * 망 : meclass :: PIMPL :: WEIGHTATI"(WEIGHTATI @ PIMPL @ meclass 망 @ @@ $$ Q0PANA?)

때문에 내 생성자 :

meclass::PIMPL() { 
    if (!doneStaticInit) { 
     double sumOfWeights = 0.0; 
     for (int i = 0; i < NUMTRACES; i++) { 
      WEIGHTATI[i] = SQUARED(1 - SQUARED(MAXTRACEWRTMIDTRACE * (MIDTRACE - i)/double(MIDTRACE))); 
      sumOfWeights += WEIGHTATI[i]; 
     } 
     for (int i = 0; i < NUMTRACES; i++) WEIGHTATI[i] /= sumOfWeights; 
     doneStaticInit = true; 
    } 
} 
+0

명시 적으로하지 프로그램 초기화 될 것으로 보인다. – John

+0

+1 현재 보급 된 parrallel 프로세서의 엄청난 인기. –

+2

parrallel 가공업자의 거대한 인구는 현재 퍼집니다. ?! 의도적으로 저것을 쓴다고 말해주세요! – Daniel

답변

1

당신은 당신의 생성자에 static bool 플래그를 넣을 수 있습니다. 플래그는 처음 호출 될 때만 false으로 초기화됩니다. 그 후에도 계속 될 것입니다.소스 파일에서

// foo.h 

class Foo { 
    static const int MIDTRACE = 3; // static const, no definition needed 
    static const int NUMTRACES = 2 * MIDTRACE + 1; // static const, no definition needed 
    static double WEIGHTATI[NUMTRACES]; // not const, so need definition outside of class 
public: 
    Foo() { 
    static bool array_initialized = false; 
    if(!array_initialized) { 
     // Initialize array 
     array_initialized = true; 
    } 
    } 
    // Other members 
}; 

은, 파일 헤더 없습니다 :

// foo.cpp 
include "foo.h" 
double Foo::WEIGHTATI[NUMTRACES]; 
+0

두배의 정적 배열을 초기화하는 방법은 무엇입니까? 오류가 발생했습니다 (업데이트 된 OP에 표시됨). 모든 것은 명시 적 초기화가 필요하고 프로그램 적 초기화를 방해하는 것처럼 보입니다. – John

+0

여전히 클래스 외부의 소스 파일에서 정적 double WEIGHTATI [NUMTRACES]를 정의해야합니다 :'double meclass :: WEIGHTATI [NUMTRACES];'. 생성자는 클래스와 동일한 이름을 가져야합니다 :'meclass :: meclass()'. – JohnPS

+0

PIMPL은 하위 클래스이고, meclass는 단순한 래퍼입니다. double meclass::WEIGHTATI[NUMTRACES];은 정의가 아닙니다.? 이것은 몸 안에있는 모든 것이기 때문에 나는 그것들을 멤버 변수가 아닌 변수로 채웠다. – John

2

초기화 => 생성자. 일단 => 정적 인스턴스. 그래서 한 가지 방법은 생성자가있는 정적 인스턴스입니다.

#include <iostream> 

struct Foo 
{ 
    Foo() 
    { 
     std::cout << "Initializing them values..." << std::endl; 
     for(int i = 0; i < 3; ++i) 
     { 
      values[i] = i; 
     } 
    }; 

    int values[3]; 
}; 

void doThings() 
{ 
    static Foo const foo;  // Is initialized ONCE. 

    for(int i = 0; i < 3; ++i) 
    { 
     std::cout << foo.values[i] << " "; 
    } 
    std::cout << std::endl; 
} 

int main() 
{ 
    doThings(); 
    doThings(); 
    doThings(); 
} 

건배 & HTH.,

+0

사이트가 그것을 거절하지 않으면 내가 편집 한 내용이 상당합니다. ____EDIT____ 괜찮습니다. 생성자는 다음과 같습니다. 내 정적, const 및 초기화 gremlins를 거래로 바꾸기를 바랄뿐입니다. – John

+0

생성자에서이 작업을 수행하는 것은 각 인스턴스화시 다시 초기화된다는 점입니다. 게다가 당신은/my 배열을 정적으로 선언하지 않았기 때문에, "Once => static instance"가 IMHO에 남아 있습니다. 죄송합니다. 정적 사용을위한 클래스를 원한다고 생각한다면 분명히해야합니다. – John

+0

@ 존 : 코드를 좀 더 명확하게 변경했습니다. 원래의 코드와 현재의 코드에서'foo'는 static, const이고 한번 초기화되었습니다. 그러나이 새 코드를 실행하면 한 번만 초기화된다는 것을 볼 수 있습니다. –

관련 문제