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。此外,当您删除内存时,将指针分配给NULLnullptr再次。这样,您将能够通过简单的检查始终查看指针是否有效。

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

UPD

我建议你摆脱你的Settings班级,直接使用 QSettings 。您不需要弄乱指针,并且对 QSettings 的读/写非常快。

现在,也不要忘记您可以使用堆中的 QSettings:

QSettings * settings = new QSettings();

如果您希望每个设置集都有一个“父级”,您可以Settings从 派生您的类QSettings,然后在其中添加一个parent字段。这将保留 的所有功能QSettings,非常方便。

实际上,您的方法也很好,您只需检查指针是否有效。

于 2012-08-07T10:16:41.973 回答
0

好的,所以问题是“我正在设置一个指向可能存在或不存在的指针的指针”。在这种情况下,空对象模式应该会有所帮助。这样你应该能够摆脱 if 子句

于 2012-08-07T10:20:21.857 回答
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();

我可以通过执行以下操作从任何类(duh!)中检索相同的信息:

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 回答