C++如何将数据放置在基类的向量中

  • 本文关键字:基类 向量 数据 C++ c++
  • 更新时间 :
  • 英文 :


这是我的基类:

#include <string>
#include "DataStruct.h"
#include <vector>
#include <mysqlx/xdevapi.h>
#include <iostream>
#include <memory>
namespace Vibranium {
using namespace mysqlx;
class MySQLTable {
public:
MySQLTable();
virtual ~MySQLTable() = default;
int Index;
std::string tableName;
DataStruct dataStruct;
std::vector<std::unique_ptr<DataStruct>> Data;
Table getTable(Session& conn) const;
RowResult getAll(Session& conn) const;
virtual void LoadTable(RowResult& res) {}
};
}
#endif //VIBRANIUM_CORE_MYSQLTABLE_H

它代表了我可能拥有的所有MySQL表。看看类型为DataStructData向量。我使用DataStruct作为基础结构,因为所有表都有不同的结构。

这里是基础DataStruct结构:

namespace Vibranium{
struct DataStruct{};
}

然后我定义了我的第一个mysql表Accounts:

#include <string>
#include "Database/DataStruct.h"
#include "Database/MySQLTable.h"

namespace Vibranium{
using namespace std;
struct AccountsStruct : DataStruct{
int id;
std::string email;
std::string warTag;
int state;
std::string name;
std::string lastname;
std::string country;
int dob_month;
int dob_day;
int dob_year;
double balance;
std::string created_at;
std::string updated_at;
int account_role;
int rank;
int playerRole;
};

class Accounts : public MySQLTable{
public:
Accounts() = default;
void LoadTable(RowResult& res) override;
};
}

正如你在里面看到的,我已经将AccountsStruct定义为DataStruct的子级。以下是我如何实现LoadTable:

#include "Accounts.h"
using namespace Vibranium;
void Vibranium::Accounts::LoadTable(RowResult &res) {
std::vector<AccountsStruct> accounts;
AccountsStruct accountsStruct;
for (Row row : res.fetchAll()){
accountsStruct.id = row[0].get<int>();
accountsStruct.email = row[1].get<std::string>();
accountsStruct.warTag = row[2].get<std::string>();
accountsStruct.state = row[4].get<int>();
accountsStruct.name = row[5].get<std::string>();
accountsStruct.lastname = row[6].get<std::string>();
accountsStruct.country = row[7].get<std::string>();
accountsStruct.dob_month = row[8].get<int>();
accountsStruct.dob_day = row[9].get<int>();
accountsStruct.dob_year = row[10].get<int>();
accountsStruct.balance = row[11].get<double>();
accountsStruct.created_at = row[12].get<std::string>();
accountsStruct.updated_at = row[13].get<std::string>();
accountsStruct.account_role = row[15].get<int>();
accountsStruct.rank = row[16].get<int>();
accountsStruct.playerRole = row[17].get<int>();
accounts.push_back(accountsStruct);
}
}

由于AccountsMySQLTable的子级

  1. 我想将来自std::vector<AccountsStruct> accounts的所有数据添加到继承自MySQlTableData向量中
  2. 在那之后,我想循环通过向量Data,因为它是类型Accounts而不是MySQLTable类。但是我没有知道我怎样才能做到这两件事

这可能吗?

我将删除类型DataStruct,并将MySqlTable作为模板。

#include <string>
#include <vector>
#include <mysqlx/xdevapi.h>
#include <memory>
namespace Vibranium {
using mysqlx::Table;
using mysqlx::RowResult;
using mysqlx::Session;
class MySQLTableBase {
public:
MySQLTableBase();
virtual ~MySQLTableBase() = default;
Table getTable(Session& conn) const;
RowResult getAll(Session& conn) const;
int Index;
std::string tableName;
};
template <typename T>
class MySQLTable : public MySQLTableBase {
public:
virtual void LoadTable(RowResult& res) = 0;
T dataStruct; // What is this?
std::vector<T> Data; // You don't need vector of pointers
};
}

然后将AccountAccounts定义为

#include <string>
#include "Database/MySQLTable.h"
namespace Vibranium{
struct Account{
int id;
std::string email;
std::string warTag;
int state;
std::string name;
std::string lastname;
std::string country;
int dob_month;
int dob_day;
int dob_year;
double balance;
std::string created_at;
std::string updated_at;
int account_role;
int rank;
int playerRole;
};
class Accounts : public MySQLTable<Account>{
public:
Accounts() = default;
void LoadTable(RowResult& res) override;
};
}

所以,用C++玩得开心!

  1. 您在MySQLTable中没有一个名为"的向量;数据";。您有返回向量的方法(Data(。。。要实现您的请求,您应该创建方法(例如(void SetData(…(。

  2. 你不能。您可以在Data的矢量中循环,并将每个元素从Data强制转换(例如static_cast或其他(到AccountStruct。警告!错误的强制转换操作可能会导致未定义的行为、崩溃等。!

最新更新