0

私は次の問題を抱えています(OOPスタイルのC ++を学ぶだけです):3つのクラスがあります:

  1. アプリ
  2. objectManager
  3. 物体

appクラスは起動変数を設定し、objectManagerのインスタンスを作成します。これは、objectManagerに、さまざまなファイルから値をロードし、各オブジェクトに必要なデータをベクトルで事前計算するように指示します。

私の問題は次のとおりです。各オブジェクトにアクセス可能な事前計算されたベクトルを使用したいと思います。オブジェクトからこの変数にアクセスする方法がわかりません。オブジェクトはマネージャーのインスタンスについてまったく何も知らないからです。

シングルトンについて読んだことがありますが、どのように実装すればよいかわかりません。

静的データメンバーについて読んだことがありますが、AFAIKではまだobjectManagerインスタンスに接続する必要があるようですので、役に立ちません。

グローバル変数を試しましたが(わかっています...)、コンパイルエラーが発生しました。

objectManager.hのクラス定義の外に静的変数を配置しようとしましたが(グローバルな場合ですか?)、奇妙なことになりました。objectManager.hを含むプログラムのすべての部分から変数にアクセスできます。 、ただし、その値はクラスごとに異なります/初期化されていません。

objectManager.h

#pragma once
#include "Object.h"

static int xxxtest;

class objectManager
{

objectManager.cpp

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

object.cppまたはapp.cpp(後)にいる間

cout << xxxtest << endl;
-> 0

ここで何が起こっているのか説明してもらえますか?

事前に計算された変数をプログラムの他の部分にアクセスできるようにしながら、そのようなプログラムを整理するためのシンプルでクリーンな方法を私に勧めてもらえますか?

4

2 に答える 2

0

静的クラス変数は実際には解決策です。

クラスの静的変数は、インクルードの直後のCPPファイルで宣言する必要があります。

ヘッダ:

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

CPP:

int Class::staticVariable = 5;

そうすれば、すべてのObjectインスタンスが静的変数(プライベートの場合)にアクセスでき、プログラム全体のすべてのメンバーが次のように記述して(パブリックの場合)静的変数にアクセスできます。

int Value = Class::staticVariable;

これが光を当てるのに役立つことを願っています。そうそう、http://de.wikibooks.org/wiki/C ++- Programmierung:_Statische_Elemente_in_Klassen(ページはドイツ語)のコードを参照として使用しました。

問題に戻るには、次のことを意味します。

ヘッダ:

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

CPP:

std::vector<double> Precompiled;    //Initialized automatically.
于 2012-07-21T15:49:07.447 に答える
0

作成するのは1つだけなのでobjectManager、シングルトンまたは通常のグローバルの候補になります。グローバルとして、次のようなヘッダーファイルを定義できます。

// 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();
于 2012-07-21T16:18:26.033 に答える