gpt4 book ai didi

C++/QT : Using constant pointer to private member as read-only data-sharing

转载 作者:行者123 更新时间:2023-11-28 04:31:38 25 4
gpt4 key购买 nike

我正在用 QT 编写程序,目前有一个 GameEngine 类和一个 MainWindow 类。

游戏引擎.h:

#include "Player.h"

class GameEngine : public QObject
{
Q_OBJECT

public:
void test();

signals:
void newPlayerDataReady(const std::vector<Player>* playerList);

private:
std::vector<Player> mPlayers; // List of player objects
}

游戏引擎.cpp

#include "GameEngine.h"

// Omitting constructor and destructor for simplicity of the example

void GameEngine::test() {
emit newPlayerDataReady(&mPlayers);
}

GameEngine 将大量数据存储在 Player 实例数组中(Player 本身是一个相当复杂的类,具有许多不同的成员),必须将其存储在那里以集中逻辑程序(长话短说)。

MainWindow 是一个 GUI 类,它应该可视化数据,当信号 newPlayerDataReady 发出并在图形上表示大量数据时,列表等。这是通过将信号连接到 MainWindow 类中的专用插槽来完成的。连接在 Main.cpp 中创建,它拥有两个类的实例。

所以,我的问题是:如果我想在不让接收方更改数据(只读访问)的情况下将所有这些数据从一个类共享到另一个类,是否有更好的通用做法来执行此操作,而不是使用指向数据的常量指针?

并不是我不喜欢这个解决方案。我只是想绝对确定我从一开始就做对了,而不是在过程的后期进行大量返工。

我知道有一种替代方案可以将数据交换为私有(private)成员的拷贝,但我认为这不是一个顺利的解决方案,因为数据量会增加到一定程度,这可能会影响程序的速度。

最佳答案

So, my question is: If I want to share all this data from one class to another without letting the receiver alter the data (read-only access), is there a better common practice to do this, rather than using constant pointers to the data?

通过常量指针共享很好,尽管共享常量引用(即 const std::vector<Player> & )可能更可取,因为任何接收常量引用的代码都可以 100% 确保它接收到的任何引用都不是't NULL,因为语言不允许 NULL 引用(而 NULL 指针是允许的)。

要考虑的另一件事是对象生命周期问题——即如果您传递一个 const std::vector<Player>*给你的MainWindow类,以及 MainWindow类保留该指针值的拷贝(即将传入的指针复制到局部成员变量),然后 vector 被破坏,MainWindow如果/当它试图取消引用指针时,将留下一个悬空指针,该指针将调用未定义的行为(即可能崩溃,或者更糟,以某种非常难以调试的方式默默地破坏程序的内存空间)。如果你想避免那个特定惨败的任何可能性,你可以通过智能指针传递数据(即 shared_ptr ,或者如果你更喜欢使用 Qt 特定的 API, QSharedPointer or QPointer 对象)

关于C++/QT : Using constant pointer to private member as read-only data-sharing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52749551/

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