静态const默认用户对象的正确性及shared_ptr赋值方式咨询
嘿,咱们一步步拆解你的问题,给你清晰的解决方案:
问题1:使用static const修饰默认用户对象是否正确?
完全正确!你的依据非常到位:
const修饰符确保xDefaultUser的属性不会被意外修改,完美符合“默认用户是固定不可变”的需求;static保证这个对象的生命周期贯穿整个应用程序——从启动时初始化,直到进程结束才销毁,刚好满足登出后需要一直可用的默认用户场景。
如果这个默认用户是类的成员变量,记得在类的实现文件(.cpp)中完成定义(头文件中仅声明),比如:
// 头文件中声明 class YourAuthClass { private: static const CUser xDefaultUser; // ... }; // cpp文件中定义 const CUser YourAuthClass::xDefaultUser(L"Default", L"password", CUser::EAccessLevels::eAnon);
问题2:如何将默认用户赋值给m_pCurrentUser?是否应声明const shared_ptr<CUser>?
这里需要注意类型匹配和shared_ptr的销毁逻辑,分两种情况说明:
推荐方案:调整m_pCurrentUser为shared_ptr<const CUser>
既然默认用户是const的,且登录后的用户通常也不应该被随意修改(从权限设计的角度,用户属性应该通过特定接口更新,而非直接修改指针指向的对象),最合理的做法是把m_pCurrentUser的类型改为:
std::shared_ptr<const CUser> m_pCurrentUser;
登出时赋值的话,需要注意:xDefaultUser是静态对象,不能被shared_ptr默认的删除器(delete)销毁,所以要传入一个空的自定义删除器,告诉shared_ptr不需要销毁这个对象:
// 登出逻辑 m_pCurrentUser = std::shared_ptr<const CUser>(&xDefaultUser, [](const CUser*) {});
不推荐的方案:保留shared_ptr<CUser>并使用const_cast
如果业务上确实需要m_pCurrentUser指向非const的CUser(比如需要直接修改当前用户的属性),你可以用const_cast去掉xDefaultUser的const限定,但这种做法非常不推荐——它会打破const的安全承诺,容易导致意外修改默认用户的属性:
// 不推荐,仅作为极端场景下的备选 m_pCurrentUser = std::shared_ptr<CUser>(const_cast<CUser*>(&xDefaultUser), [](CUser*) {});
为什么不用const shared_ptr<CUser>?
const shared_ptr<CUser>的含义是指针本身不可被重新赋值,也就是说你无法让m_pCurrentUser从指向登录用户切换为指向默认用户——这完全不符合你登出时的需求,所以这不是你要的类型。
内容的提问来源于stack exchange,提问作者bananamana
相关产品推荐
相关产品推荐

