2

速度の最適化に重点を置いて、QT を使用して C++ アプリを作成しています。異なるスレッドに対して読み取り専用アクセスを持ついくつかのグローバル オブジェクトが必要です。スレッドを開く前に、グローバル オブジェクトを初期化し、データを入力する必要があります。

グローバル オブジェクトのセット関数を保護しながら、メイン関数からアクセスするにはどうすればよいですか?

現在のようなコード例:

myClass.h

class MyObjectClass {
public:
void SetSome(const QList<QString> &value);
QList<QString> GetSome() const;

private:
    QList<QString> m_myMember;
};

main.cpp

#include "global.h" // some like: extern MyObjectClass g_InihalizedInMain;
#include "anyThread.h"

int main(){

g_InitializedInMain.SetSome() // This Shut work

MyThread thread;
thread.start();

//..
return 0;
}

anyThread.cpp:

#include "global.h"

void thread::run()
{
MyObjectClass newObject = g_InihalizedInMain; //This shut work
g_InitializedInMain.GetSome();                  //This shut work
g_InitializedInMain.SetSome();                  //This shut not work and give me an error during compile time
newObject.SetSome();                    //This shut work
}

デザインのアイデアをいくつかいただければ幸いです。どうもありがとうございました。

4

3 に答える 3

0
class MyPrivateObjectClass : private MyObjectClass
{
public:
   friend void main();
};

extern MyPrivateObjectClass g_InitializedInMain;
于 2012-10-30T17:00:49.903 に答える
0

手始めに、私はグローバル変数を絶​​対に避けようとします。

グローバル変数の代わりにできることは、メインで変数をインスタンス化し(動的に、または好みに応じてスタック上でローカルに)、スレッドオブジェクトに設定することです(これはと呼ばれますdependency injection

メインからのみMyObjectClassの設定属性を制御するには、次の2つのオプションを考えることができます。

  1. mainのコンストラクターを介してすべてのMyObjectClass属性を設定します。これにより、セッターを削除できますが、ゲッターはそのままにしておきます。MyObjectClassは不変です。

  2. MyObjectClassのすべての設定可能な属性を含むコンテキストオブジェクトを作成します。このコンテキストオブジェクトは、MyObjectClassコンストラクターにのみ渡すことができます。コンテキストオブジェクトはmainで作成し、適切なセッターを呼び出してから、mainからのインスタンス化時にMyObjectClassに渡す必要があります。MyObjectClassクラスは、コンテキストオブジェクトのこれらの属性を内部的に使用しますが、それらの属性はありません。もちろん、MyObjectClassには、内部コンテキストオブジェクトから値を取得するゲッターがあります。MyObjectClassは不変ですが、この方法はもう少し柔軟性があります。

私は2番目のオプションを好みます。コードサンプルは次のとおりです。

myClass.h

class MyObjectContext {
public:
    void SetSome(const QList<QString> &value);
    QList<QString> GetSome() const;

private:
    QList<QString> m_myMember;
};

class MyObjectClass {
public:
    MyObjectClass(MyObjectContext *context) : context_(context) {}
    QList<QString> GetSome() const {return context_->GetSome();}

    // Put the rest of the important stuff here

private:
    MyObjectContext *context_;
    MyObjectClass(); // explicitly stating that the default ctor cant be called
};

main.cpp

int main(){

    // creating these objects on the stack, you may need
    // to create them dynamically, its up to you
    MyObjectContext context;
    context.SetSome() // This Should work

    MyObjectClass moc(&context);

    MyThread thread(&moc);
    thread.start();

    //..
    return 0;
}

anyThread.h

class MyThread : public QThread { // Assuming you're inheriting from QThread
public:
    // instead of setting it via the ctor, you could consider adding a setter
    MyThread(MyObjectClass *moc) : moc_(moc) {}
    void run();

private:
    MyThread(); // explicitly stating that the default ctor cant be called
    MyObjecctClass *moc_
};

anyThread.cpp

void MyThread::run()
{
    moc_->GetSome();                  //This should work

    // Dont have to worry about the setters, since there are none
    // available for the MyObjectClass, which is now immutable
}
于 2012-10-30T18:10:37.393 に答える
0

static1 つのソース ファイルのみがアクセスできることを意味するグローバル変数を作成します。次に、他のスレッドからデータを読み取ることができるアクセサー関数を提供できます。

于 2012-10-30T17:08:07.693 に答える