如何用非静态struct实例初始化类的静态vector成员容器?
问题分析
你尝试用tableOrder类的非静态成员table_1到table_5初始化静态容器allTables,这是行不通的——非静态成员属于类的实例对象,在静态成员初始化阶段(程序启动时)还没有任何tableOrder对象被创建,自然无法访问这些非静态成员。以下是针对不同需求的可行解决方案:
解决方案1:将每个对象的非静态table实例加入静态vector(存储拷贝)
如果你的需求是每个tableOrder对象拥有独立的5张桌子,且需要把所有对象的桌子收集到静态allTables中,可以在构造函数里完成添加操作:
步骤1:修改头文件
保留原静态容器声明:
static vector<table> allTables;
步骤2:修改cpp文件
- 初始化静态容器为空:
vector<table> tableOrder::allTables = {};
- 在构造函数中添加当前对象的桌子实例:
tableOrder::tableOrder() { assignedTableNumber = 0; assignedTable = table_1; // 将当前对象的桌子拷贝加入静态容器 allTables.push_back(table_1); allTables.push_back(table_2); allTables.push_back(table_3); allTables.push_back(table_4); allTables.push_back(table_5); }
⚠️ 注意:此方式存储的是实例拷贝,原对象的桌子状态变化不会同步到allTables中。
解决方案2:将每个对象的非静态table实例加入静态vector(存储指针,跟踪原实例)
如果需要allTables实时反映原实例的状态变化,应存储指针而非拷贝:
步骤1:修改头文件
将静态容器类型改为指针:
static vector<table*> allTables;
步骤2:修改cpp文件
- 初始化静态容器为空:
vector<table*> tableOrder::allTables = {};
- 在构造函数中添加指针,同时添加析构函数避免悬空指针:
#include <algorithm> // 用于remove_if tableOrder::tableOrder() { assignedTableNumber = 0; assignedTable = table_1; // 将当前对象桌子的指针加入静态容器 allTables.push_back(&table_1); allTables.push_back(&table_2); allTables.push_back(&table_3); allTables.push_back(&table_4); allTables.push_back(&table_5); } tableOrder::~tableOrder() { // 从静态容器中移除当前对象桌子的指针 auto match_ptr = [this](table* ptr) { return ptr == &table_1 || ptr == &table_2 || ptr == &table_3 || ptr == &table_4 || ptr == &table_5; }; allTables.erase(remove_if(allTables.begin(), allTables.end(), match_ptr), allTables.end()); }
解决方案3:全局共享5张桌子(无需类内非静态实例)
如果实际需求是整个程序共享一套5张桌子,只是不想把这些实例声明为tableOrder的静态成员,可以直接在静态容器初始化时构造桌子:
步骤1:修改头文件
移除类内的table_1到table_5非静态成员,或改为引用静态容器中的实例:
class tableOrder { public: // 若需要在类内直接访问桌子,改为引用静态容器中的实例 table& table_1; table& table_2; table& table_3; table& table_4; table& table_5; tableOrder() : table_1(allTables[0]), table_2(allTables[1]), table_3(allTables[2]), table_4(allTables[3]), table_5(allTables[4]) { assignedTableNumber = 0; assignedTable = table_1; } // ...其他成员 static vector<table> allTables; // ...其他静态容器 };
步骤2:修改cpp文件
直接在静态容器初始化时构造5张桌子:
vector<table> tableOrder::allTables = { {1, 6, 0, false}, {2, 5, 0, false}, {3, 4, 0, false}, {4, 8, 0, false}, {5, 4, 0, false} }; // 其他静态容器初始化不变 vector<table> tableOrder::availableTables = {}; vector<table> tableOrder::TablesInUse = {}; vector<table> tableOrder::TablesToSelect = {};
此方式下,所有tableOrder对象共享同一套桌子,类内的table_1到table_5是对静态容器实例的引用,本身并非静态成员。
内容的提问来源于stack exchange,提问作者link
相关产品推荐
相关产品推荐

