2012-07-21 2 views
0

나는 다음과 같은 문제를 (단지 학습 OOP 스타일의 C++를) 한 : 나는 3 종류가 있습니다모든 구성원이 액세스 할 수 있어야하는 데이터를 저장하는 방법은 무엇입니까?

  1. 응용 프로그램
  2. objectManager을
  3. 객체

응용 클래스는 시작 변수를 설정하고 생성 objectManager의 인스턴스 이 함수는 objectManager에 다른 파일의 값을로드하고 각 객체에 필요한 데이터를 벡터에 미리 계산하도록 지시합니다.

내 문제는 다음과 같습니다. 각 개체에 액세스 할 수있는 미리 계산 된 벡터를 사용하고 싶습니다. 관리자의 인스턴스에 대해 전혀 아는 바가 없으므로 객체에서이 변수에 어떻게 액세스 할 수 있는지 이해할 수 없습니다.

싱글 톤에 대해 읽었지만 어떻게 구현해야하는지 잘 모릅니다.

나는에 대해 정적 데이터 멤버를 읽었지만 AFAIK는 여전히 objectManager 인스턴스에 연결해야하므로 AFAIK가 도움이되지 않습니다.

전 세계 변수 (0120)을 시도했지만 컴파일 오류가 발생했습니다.

나는 objectManager.h (? 그것이 글로벌 경우)에 클래스 정의 외부 정적 변수를 넣어 시도했습니다, 나는 이상한 뭔가 결국 : 나는 모든 부분에서 변수에 액세스 할 수 있습니다 이 프로그램에는 objectManager.h가 포함되어 있지만 값은 다른 클래스에서 다르기/초기화되지 않았습니다.

objectManager.h

#pragma once 
#include "Object.h" 

static int xxxtest; 

class objectManager 
{ 

object.cpp 또는 app.cpp에서 (후)

cout << xxxtest << endl; 
-> 0 

당신이 나에게 설명 할 수있는 동안 objectManager.cpp이

xxxtest = 123456; 
cout << xxxtest << endl; 
-> 123456 

것입니다 여기서 일어나는거야?

미리 계산 된 변수를 프로그램의 다른 부분에 액세스 할 수있게 만드는 동안 이러한 프로그램을 간단하고 깨끗하게 구성하는 방법을 권할 수 있습니까?

+0

'object'와'objectManager'의 관계는 무엇입니까? 'object'와'app'의 관계는 무엇입니까? – jxh

+0

응용 프로그램은 하나의 objectmanager (편도)를 호출하고 objectmanager는 많은 객체를 만들고 objectmanager에서이 미리 계산 된 벡터에 객체가 액세스해야합니다 (양방향) – zsero

답변

0

실제로 정적 클래스 변수가 해결책입니다.

클래스의 정적 변수는 포함 이후에 CPP 파일에서 선언해야합니다.

헤더 :

class Class { 
    static int staticVariable; 
    static void staticFunction(); 
    //... 
}; 

CPP :

int Class::staticVariable = 5; 

은 그렇게 모든 개체 인스턴스는 정적 변수에 액세스 할 수 있습니다 (이 있다면 개인) 및 전체 프로그램의 모든 구성원이 액세스 할 수 있습니다 (공개 인 경우) :

int Value = Class::staticVariable; 

나는 이것이 빛을 비추는 데 도움이되기를 바랍니다. 아, 저는 http://de.wikibooks.org/wiki/C++-Programmierung:_Statische_Elemente_in_Klassen (페이지는 독일어)의 코드를 참조로 사용했습니다.

다시 문제를 얻으려면, 그 의미 :

헤더 :

class objectManager { 
    static std::vector<double> Precompiled; 
}; 

CPP를 : 당신은 하나의 objectManager를 만들려하기 때문에

std::vector<double> Precompiled; //Initialized automatically. 
+0

고마워요! 나는 이것을 이렇게 만들었다! 함수 몸체 외부에서 정적을 사용할 때 왜 이상한 다른 멤버 초기화를했는지 알 수 있습니까? 그것은 글로벌인가? – zsero

+0

대단히 반갑습니다. :) 예, 함수 외부의 정적 ... 또는 함수/클래스 정의 외부의 변수 ... 전역입니다. 그리고 저는 그것들을 믿습니다. 정적은 다시 한번 다르게 행동합니다. – ATaylor

0

, 그것은 후보 싱글 톤 또는 일반 글로벌의 경우 세계적으로이 같은 헤더 파일을 정의 할 수 있습니다 :

// in object_manager.hpp 
class App; 
class ObjectManager; 
class ObjectManagerImpl; 
ObjectManager & objectManager(); 
class ObjectManager { 
    friend ObjectManager & objectManager(); 
    friend class App; 
    std::unique_ptr<ObjectManagerImpl> impl_; 
    ObjectManager(); 
    void read_files (std::string file1, std::string file2); 
public: 
    std::vector<int> & precomputed(); 
    //... 
}; 

그리고 소스 파일에서

, 당신이 뭔가를 할 수 :

// in object_manager.cpp 

class ObjectManagerImpl { 
    friend class ObjectManager; 
    std::vector<int> precomputed_; 
    //... 
}; 

ObjectManager::ObjectManager() : impl_(new ObjectManagerImpl) {} 

void ObjectManager::read_files (std::string file1, std::string file2) { 
    //... 
} 

std::vector<int> & ObjectManager::precomputed() { 
    return impl_->precomputed_; 
} 

//... 

ObjectManager & objectManager() { 
    static ObjectManager instance; 
    return instance; 
} 

지금, 당신의 object의 소스 파일, 당신을 objectManager의 헤더 파일을 포함하고 접근자를 통해 vector에 액세스합니다.

// in object.cpp 

//... 
    std::vector<int> &precomputed = objectManager().precomputed(); 
관련 문제