C++/QT:使用指向私有成员的常量指针作为只读数据共享
C++/QT: Using constant pointer to private member as read-only data-sharing
我正在用QT写一个程序,目前有一个GameEngine
class和一个MainWindow
class.
GameEngine.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
}
GameEngine.cpp
#include "GameEngine.h"
// Omitting constructor and destructor for simplicity of the example
void GameEngine::test() {
emit newPlayerDataReady(&mPlayers);
}
GameEngine
在 Player 实例数组中存储了大量数据(Player 是一个相当复杂的 class 本身,有很多不同的成员),必须存储在那里集中程序的逻辑(长话短说)。
MainWindow
是一个 GUI class,它应该可视化数据,当信号 newPlayerDataReady
发出并在图表上表示大量数据时,一个列表等。这是通过将信号连接到 MainWindow
class 中的专用插槽来完成的。连接在 Main.cpp 中创建,它拥有两个 classes.
的实例
所以,我的问题是:
如果我想在不让接收方更改数据(只读访问)的情况下将所有这些数据从一个 class 共享到另一个,是否有更好的通用做法来执行此操作,而不是使用常量指向数据的指针?
并不是我不喜欢这个解决方案。我只是想绝对确定我从一开始就做对了,而不是在这个过程的后期进行大量返工。
我知道可以通过一种替代方法将数据交换为私有成员的副本,但我认为这不是一个顺利的解决方案,因为数据量会增加到一定程度,可能影响程序运行速度。
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-pointers 共享很好,尽管共享 const-reference(即 const std::vector<Player> &
)可能更可取,因为任何接收 const-reference 的代码都可以 100% 确保任何它收到的引用不是 NULL,因为语言不允许 NULL 引用(而 NULL 指针是允许的)。
要考虑的另一件事是对象生命周期问题——即如果您将 const std::vector<Player>*
传递给 MainWindow
class,并且 MainWindow
class 保留该指针值的副本(即将传入的指针复制到局部成员变量),然后向量被破坏, MainWindow
将保留一个悬空指针,该悬空指针将调用 undefined行为(即可能崩溃,或者更糟,以某种非常难以调试的方式无声地破坏程序的内存 space)if/when 它曾经尝试取消引用指针。如果你想避免那个特定惨败的任何可能性,你可以通过智能指针传递数据(即 shared_ptr, or if you prefer to use the Qt-specific APIs, a QSharedPointer or QPointer 对象)
我正在用QT写一个程序,目前有一个GameEngine
class和一个MainWindow
class.
GameEngine.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
}
GameEngine.cpp
#include "GameEngine.h"
// Omitting constructor and destructor for simplicity of the example
void GameEngine::test() {
emit newPlayerDataReady(&mPlayers);
}
GameEngine
在 Player 实例数组中存储了大量数据(Player 是一个相当复杂的 class 本身,有很多不同的成员),必须存储在那里集中程序的逻辑(长话短说)。
MainWindow
是一个 GUI class,它应该可视化数据,当信号 newPlayerDataReady
发出并在图表上表示大量数据时,一个列表等。这是通过将信号连接到 MainWindow
class 中的专用插槽来完成的。连接在 Main.cpp 中创建,它拥有两个 classes.
所以,我的问题是: 如果我想在不让接收方更改数据(只读访问)的情况下将所有这些数据从一个 class 共享到另一个,是否有更好的通用做法来执行此操作,而不是使用常量指向数据的指针?
并不是我不喜欢这个解决方案。我只是想绝对确定我从一开始就做对了,而不是在这个过程的后期进行大量返工。
我知道可以通过一种替代方法将数据交换为私有成员的副本,但我认为这不是一个顺利的解决方案,因为数据量会增加到一定程度,可能影响程序运行速度。
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-pointers 共享很好,尽管共享 const-reference(即 const std::vector<Player> &
)可能更可取,因为任何接收 const-reference 的代码都可以 100% 确保任何它收到的引用不是 NULL,因为语言不允许 NULL 引用(而 NULL 指针是允许的)。
要考虑的另一件事是对象生命周期问题——即如果您将 const std::vector<Player>*
传递给 MainWindow
class,并且 MainWindow
class 保留该指针值的副本(即将传入的指针复制到局部成员变量),然后向量被破坏, MainWindow
将保留一个悬空指针,该悬空指针将调用 undefined行为(即可能崩溃,或者更糟,以某种非常难以调试的方式无声地破坏程序的内存 space)if/when 它曾经尝试取消引用指针。如果你想避免那个特定惨败的任何可能性,你可以通过智能指针传递数据(即 shared_ptr, or if you prefer to use the Qt-specific APIs, a QSharedPointer or QPointer 对象)