gpt4 book ai didi

C++ 析构函数

转载 作者:行者123 更新时间:2023-11-28 08:00:01 25 4
gpt4 key购买 nike

考虑这个场景:我需要为某些设置创建一个用户界面。由于理论上应该将数据和用户界面分开,因此我定义了一个单独的类来处理配置数据。我的问题是如何在设置类中实例化数据类。

一种方法是在调用者对象中创建数据类,我指的是调用设置菜单类的对象。

我的问题涉及的另一种方法是在设置类中创建一个 DATA 类变量。我怀疑当设置类被销毁时会发生什么!设置类中的数据类对象也会被破坏吗?如果它被定义为设置类的静态成员呢?

#ifndef SETTINGSWINDOW_H

#define SETTINGSWINDOW_H

#include <QMainWindow>
#include <QModelIndex>

#include <QSignalMapper>
#include <QRadioButton>
#include <QSpinBox>
#include <QTimer>

#include "cameracommands.h"

struct Config
{
/* General Options */
QString general_key_lock;
QString general_back_light;
};

//class IConfigSource
//{
//public:
// virtual Config config() const;
// virtual void setConfig(const Config& cfg);
//};

class ConfigSource /* : public IConfigSource*/
{
public:

ConfigSource() {

config_.general_back_light = "OFF";
config_.general_key_lock = "OFF";
}

Config config() const {return config_;}

void setConfig(const Config& cfg) {config_ = cfg;}

private:

Config config_;
};

class ConfigUpdater : public QObject
{
Q_OBJECT
public:
ConfigUpdater(ConfigSource& src) : src_(src) {}

public slots:

void apply () {src_.setConfig(tempConfig_);}
void cancel() {tempConfig_ = src_.config();}

public:

void updateGeneralBackLight(QString s) {tempConfig_.general_back_light = s; qDebug() << "BackLight updated :)";}
void updateGeneralKeyLock(QString s) {tempConfig_.general_key_lock = s; qDebug() << "KeyLock updated :)";}

Config tempConfig_;
ConfigSource& src_;
};

//----------------------------

namespace Ui {
class SettingsWindow;
}

class SettingsWindow : public QMainWindow
{
Q_OBJECT

public:
explicit SettingsWindow(QWidget *parent = 0);

~SettingsWindow();

signals:
void clicked(const QString &text);
void sendToPLC(QByteArray );

public slots:
void updateGeneralBackLight();
void updateGeneralKeyLock();

void getRow(QModelIndex);
void MySlot(QString);

private slots:
void on_pushButton_5_clicked();
void on_pushButton_3_clicked();

private:

void set_mappings();

Ui::SettingsWindow *ui;
ConfigUpdater *config_updater;
QSignalMapper *mapper;
};

#endif // SETTINGSWINDOW_H

这是来源:

QMainWindow(parent),
ui(new Ui::SettingsWindow)

{ /* 初始化 */

ui->setupUi(this);

ConfigSource src;

config_updater = new ConfigUpdater(src);

最佳答案

这取决于您需要如何使用它。

  • 场景 1. 程序运行时需要将设置保存在内存中。

  • 场景二,需要立即将设置保存到光盘,然后点播读取。

在场景 1 中,您需要能够始终访问内存中的数据。所以最好将 settingsUI 类和 settingsData 类分开,这样您就可以访问后者。

class settingsUI
{
<...>
private:
settingsData * data;//pointer to the data object
}

class settingsData
{
}

场景2,可以将settingsData聚合到settingsUI中,并将数据保存到文件中当 UI 被销毁时。

class settingsUI
{
public:
<...>
~settingsUI();

private:
class settingsData
{
<..>
}data;
<...>
}

class settingsUI::~settingsUI()
{
data.saveToFile();
}

是的,如果您将设置聚合到 UI 中,它会在 UI 被销毁时被销毁。将数据作为静态成员保存不是最好的主意,最好将数据与可视化表示(在您的情况下是 UI 类)分开。

更新:

如果你想保持它直到程序退出,我建议你在 UI 类中保持一个指向数据的静态指针。这是一个使用原始指针的示例,但您也可以使用智能指针。

class data
{
}

class UI
{
private:
static data * data_;
}
data* UI::data_;

当你的程序启动时,为数据分配内存:UI::data_ = new data(),当你的程序结束时(或者如果你不再需要数据),释放内存:删除 UI::data_。再次重申,最好使用智能指针,所以这只是一个例子。

关于C++ 析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11733641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com