我有以下布局:
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;
}
问题:考虑到 set
指针可能并不总是被初始化?
最佳答案
好吧,该方法本身并没有那么糟糕,但是您可以改进一些地方。
首先,如果我对您的理解正确的话,您希望传递设置(如果存在),如果不存在则传递默认值。在这种情况下,您可以使用构造函数:
class PerformOps
{
public:
PerformOps( int v1 = 33, string v2 = "Geronimo!", bool v3 = true ): var1(v1), var2(v2), var3(v3)
{
}
<...>
}
现在,如果您将构造函数调用为 PerformOps()
,将设置默认值。如果您调用它并为其提供一些值,它将使用它们:
<...>
PerformOps *op;
if(settings_not_clicked) {
op = new PerformOps( set->var1, set->var2, set->var3 );
}
else {
op = new PerformOps();
}
<...>
当然,如果您不想通过 cunstructor 来完成它,您可以只创建一个函数并像“setData()”一样调用它,并使用带有默认函数参数的相同技术。
现在,至于指针。最好始终使用NULL
初始化指针,或者如果您有c++0x,则使用nullptr
初始化指针。另外,当你删除内存时,再次将指针赋给NULL
或nullptr
。这样您就可以通过简单的检查始终查看指针是否有效。
someClass * ptr = nullptr;
<...>
ptr = new someClass();
<...>
delete ptr;
ptr = nullptr;
UPD
我建议您去掉Settings
类,直接使用QSettings。您不需要弄乱指针,读取/写入 QSettings 的速度非常快。
现在,也不要忘记您可以从堆中使用 QSettings:
QSettings * settings = new QSettings();
如果您希望每个设置集都有一个“父级”,您可以从 QSettings
派生您的 Settings
类,然后添加一个 parent
字段放入其中。这样就保留了QSettings
的所有功能,非常方便。
其实你的做法也可以,你只需要检查指针是否有效即可。
关于c++ - Qt:通过 C 类将变量从 ClassA 传递到 ClassB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11843597/