首页 > 解决方案 > 构造许多嵌套的类成员

问题描述

我想创建一个基类来处理不同数据库系统的许多 SQL 语句。

我的基本想法是这样的:

struct BaseSQLStmts {

    BaseSQLStmts(Database db) : db(db) {};

    // nested operator class Cmd.
    struct Cmd {
        Cmd(Database db, const char *sqlStmt)
        : db(db), sqlStmt(sqlStmt), sqlHandle(Database::noHandle)
        {};


        Database::Handle operator() () {
            if (sqlHandle==Database::noHandle) {
                sqlHandle = db->prepareSQL(sqlStmt);
            }

            return sqlHandle;
        }

        Database db;
        const char *sqlStmt;
        Database::Handle sqlHandle;
    };

    // SQL-Statement to construct with database and SQL.
    Cmd theSqlStmt;

    // And many more (>50) members of type Cmd.

private:
    Database db;
};

// later use:
BaseSQLStmts *dbSql = new SQLStmtsClassForDB(db);
// ...
db->execute(dbSql->theSqlStmt());

BaseSQLStmts::Cmd问题是,如何通过创建派生类来构造具有数据库和 SQL 语句类型的所有成员(超过 50 个) 。我可以const char *在构造函数中为每个 SQL 定义一个参数,但这是一个容易出错的参数数量。获取命名 SQL 语句virtual const char* theSqlStmtSQL() = 0的虚拟成员函数不适用于构造函数(纯虚拟成员)。在派生类中构造也不起作用。

任何好主意如何通过编译时检查语句的完整性来处理这个问题?

标签: c++c++14

解决方案


任何好主意如何在不使用复杂数据结构的情况下处理这个问题

这是自相矛盾的。如果您有超过 50个某种类型的值,您真的应该考虑将它们放入某个容器中。

当然,您的 50 个查询可以识别它们。甚至像

enum Queries { CreateFoo, GetBarOfFooByBaz, ..., Queries_Count }

std::vector<Cmd> commands(Queries_Count);

会有帮助的。


推荐阅读