0

私は次のレイアウトを持っています:

MainWindow  <--------- Settings
    \
     \
      V
   PerformOps

MainWindow は Settings から渡された変数を受け取り、それらを PerformOps に渡します。Settings クラスが使用されていない場合、MainWindow はデフォルトで PerformOps に渡されます。

現在私は:

class Settings{

public: 
   Settings(*parent);
   var1, var2, var3
   .
   .
   void exec();
}

class PerformOps{

public: 
   PerformOps();
   var1, var2, var3;
   .
   .
   void start();
}


class MainWindow{

private:
  Settings *set;    //share pointers over all methods
  PerformOps *op;

  bool settings_not_clicked = false;

  void saveChanges()
  {
     QSettings settings("my","app");
     settings.setValue("value1", op->var1);
     settings.setValue("value2", op->var2);
     settings.setValue("value3", op->var3);
  }

  void loadChanges()
  {
     QSettings settings("my","app");
     op->var1 = settings.value("value1");
     op->var2 = settings.value("value2");
     op->var3 = settings.value("value3");

  }

  void closeEvent(QCloseEvent *event)
  {
       event->ignore();
       saveChanges();
       event->accept();
  }

  void takeDataAndDoStuff()   //This is always called
  {
     op = new PerformOps;

     if(settings_not_clicked) {
        loadChanges()
     }
     else {
         op->var1 = 33;
         op->var2 = "Geronimo!";
         op->var3 = true;              
     }

     op->start();
  }


  void getStuff_maybe_if_clicked()   //This might not be always called
  {
     Settings *set = new Settings(this);
     set->exec()      //Pause parent, run Settings

     settings_not_clicked = false;
  }

質問:ポインタが常に初期化されるとは限らないop->var1 = set->var1;ことを考慮して、: の汚いメソッドに頼ることなく、クラス間でデータを共有するよりクリーンな方法はありますか?set

4

3 に答える 3

1

アプローチ自体は悪くないのですが、改善できる点がいくつかあります。

まず第一に、私の理解が正しければ、設定が存在する場合はそれを渡し、存在しない場合はデフォルト値を渡します。この場合、コンストラクターを利用できます。

class PerformOps
{
public:
    PerformOps( int v1 = 33, string v2 = "Geronimo!", bool v3 = true ): var1(v1), var2(v2), var3(v3)
    {
    }
    <...>
}

ここで、コンストラクターを as で呼び出すとPerformOps()、デフォルト値が設定されます。それを呼び出していくつかの値をフィードすると、それらが使用されます。

<...>
PerformOps *op;

if(settings_not_clicked) {
    op = new PerformOps( set->var1, set->var2, set->var3 );
}
else {
    op = new PerformOps();              
}
 <...>

もちろん、cunstructor を介して実行したくない場合は、関数を作成して "setData()" のように呼び出し、デフォルトの関数パラメーターで同じ手法を使用できます。


さて、ポインタについて。常にポインタを初期化することをお勧めします。NULLまたはnullptr、c++0x を使用している場合。また、メモリを削除する場合は、ポインタをNULLまたはnullptrに再度代入してください。このようにして、簡単なチェックでポインターが有効かどうかを常に確認できます。

someClass * ptr = nullptr;
<...>
ptr = new someClass();
<...>
delete ptr;
ptr = nullptr;

UPD

クラスを取り除き、SettingsQSettings を直接使用することをお勧めします。ポインターをいじる必要はなく、QSettings への読み取り/書き込みは非常に高速です。

また、ヒープから QSettings を使用できることも忘れないでください。

QSettings * settings = new QSettings();

各設定セットに「親」を持たせたい場合は、Settingsからクラスを派生させ、それにフィールドをQSettings1 つ追加するだけです。これにより、非常に便利parentな のすべての機能が保持されます。QSettings

実際、あなたのアプローチも問題ありません。ポインターが有効かどうかを確認するだけです。

于 2012-08-07T10:16:41.973 に答える
0

ちょっと待って。クラス間で QSettings を使用できることに気付きました (これは SingerOfTheFall が明らかに示唆していたことです)

したがって、私の Settings.cpp クラスから次のことができます。

QSettings sett("my");
sett.begingroup("my_groupname");
sett.setValue("value1", var1);
sett.setValue("value2", var2);
sett.setValue("value3", var3);
sett.endGroup();

そして、次のようにして、この同じ情報を任意のクラスから取得できます (当たり前!):

someRandomClass.cpp:

QSettings settings("my");
settings.beginGroup("my_groupname");
myvar1 = settings.value("value1");
myvar2 = settings.value("value2");
myvar3 = settings.value("value3");
settings.endGroup();
于 2012-08-07T11:27:15.973 に答える
0

さて、問題は「存在するかもしれないし存在しないかもしれないポインタへのポインタを設定している」ということです。そのような場合、Null Objectパターンが役立ちます。このようにして、if句を取り除くことができるはずです

于 2012-08-07T10:20:21.857 に答える