繁体   English   中英

为何对头文件中的放置很重要感到困惑

[英]Confused as to why placement matters within header file

鉴于:

class AlbumDataService
{
public:
    explicit AlbumDataService(QSqlDatabase& database);
    void init() const;

    void addAlbum(Album& album) const;
    void updateAlbum(const Album& album) const;
    void removeAlbum(int id) const;
    std::unique_ptr<std::vector<std::unique_ptr<Album>>> albums() const;

private:
    QSqlDatabase& mDatabase;
};

AlbumDataService::AlbumDataService(QSqlDatabase& database) :
    mDatabase(database)
{

}

我对以下内容为什么会离开mDatabase感到困惑,在上面的代码中为null

class DatabaseManager
{
public:
    static void debugQuery(const QSqlQuery& query);

    static DatabaseManager& instance();
    ~DatabaseManager();

    const AlbumDataService albumService;

protected:
    DatabaseManager(const QString& path = DATABASE_FILENAME);
    DatabaseManager& operator =(const DatabaseManager& rhs);

private:
    std::unique_ptr<QSqlDatabase> mDatabase;

};

但在这种情况下不是:

class DatabaseManager
{
public:
    static void debugQuery(const QSqlQuery& query);

    static DatabaseManager& instance();
    ~DatabaseManager();

protected:
    DatabaseManager(const QString& path = DATABASE_FILENAME);
    DatabaseManager& operator =(const DatabaseManager& rhs);

private:
    std::unique_ptr<QSqlDatabase> mDatabase;

public:
    const AlbumDataService albumService;
};

即使实现了DatabaseManager(const QString&); 两者之间没有变化

DatabaseManager::DatabaseManager(const QString& path) :
    mDatabase(new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE"))),
    albumService(*mDatabase)
{
    mDatabase->setDatabaseName(path);

    bool openStatus = mDatabase->open();
    qDebug() << "Database connection: " << (openStatus ? "OK" : "Error");

    albumService.init();
}

构造类时,首先要构造顺序,即初始化任何基类,然后按照它们在类定义中出现的顺序初始化数据成员。 不考虑它们在构造函数的初始化列表中出现的顺序。

这个严格的规则是有道理的,因为从语法上讲,初始化数据成员然后调用基类的构造函数没有什么不妥,但可能导致严重破坏。

看到您的公共albumService成员需要一个完全构建的mDatabase ,您将不得不以您在第二类定义中不太难看的方式来安排它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM