gpt4 book ai didi

c++ - 传递复杂类型时的常量正确性

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:58 26 4
gpt4 key购买 nike

所以,我有四个类:

App - 这表示应用程序的入口点

MainPage - 这代表主屏幕

Authenticator - 这表示用于身份验证的助手/实用程序类

LoginPage - 这表示登录屏幕。

App、MainPage 和 LoginPage 都有指向 Authenticator 的指针,事实上,当用户启动应用程序、到达主屏幕并提示登录时,它从 App 传递到 MainPage,再传递到 LoginPage在.app中创建MainPage,如果MainPage需要登录,则创建LoginPage。 Authenticator 指针在创建时传递。

假设 Authenticator 看起来像这样:

class Authenticator {
public:
std::string GetToken() const;
void Login(std::string username, std::string pass);
}

现在,App 将创建一个指向 Authenticator 的普通非 const 指针,但因为我不希望 MainPage 能够修改 Authenticator,所以我希望它存储一个指向它的 const 指针(即它只能调用 const上的成员函数)。但是,我希望 LoginPage 能够调用非 const 成员函数,例如 Login(),因此当我将 Authenticator 从 MainPage 传递到 LoginPage 时,我需要放弃 const-ness。

我的问题是:在这种情况下这样做不好吗?一个不允许修改对象的类是否应该能够将它传递给可以修改的类?还是让 App 同时创建 MainPage 和 LoginPage,并为它们提供相同的 Authenticator 以开始使用会更好吗?该选项的唯一问题是我主动创建了一个 LoginPage,而不是懒惰地创建,而且我更愿意懒惰地创建它。

提前致谢。

最佳答案

从应用程序的角度来看,MainPage 正在修改身份验证器。如果它是直接这样做或调用另一方 (LoginPage) 代表它这样做并不重要。所以 MainPage 应该得到一个非常量指针,然后应该将它传递给它的子页面以进行登录。

如果您想确保您的 MainPage 不修改 Authenticator,您可以为其实现一个基类来存储此指针并具有调用登录对话框的方法。 Authenticator 是私有(private)的,方法是 protected 。然后,您可以派生自己的 MainPageDerived,它没有(合法的,非 hacky 的)修改 Authenticator 的机会,但可以在需要时调用 LoginPage。

请注意,我说可以,因为对于 3 个类(class),我认为这是过度设计的方式。但是,如果您将来有更多页面,这可能是一种有效的方法。

关于c++ - 传递复杂类型时的常量正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16031191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com