C ++ / QT: использование константного указателя на закрытый член для обмена данными только для чтения - PullRequest
0 голосов
/ 11 октября 2018

Я пишу программу на QT, которая в настоящее время имеет класс GameEngine и класс MainWindow.

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 - довольно сложный класс с большим количеством различных членов), который должен храниться там для централизации логикипрограмма (короткая история).

MainWindow - это класс графического интерфейса, который должен визуализировать данные, когда испускается сигнал newPlayerDataReady, и представлять большую часть данных на графике., список и т. д. Это делается путем подключения сигнала к выделенному слоту в классе MainWindow.Соединение создается в Main.cpp, который владеет экземпляром обоих классов.

Итак, мой вопрос: Если я хочу поделиться всеми этими данными из одного класса в другой, не позволяя получателю изменитьданные (доступ только для чтения), есть ли более распространенная практика для этого, чем использовать постоянные указатели на данные?

Не то, чтобы мне не нравилось это решение.Я просто хочу быть абсолютно уверенным, что я делаю это правильно с самого начала, а не переделывать много позже в этом процессе.

Я знаю, что можно было бы сделать одну альтернативу для обмена данными как копиями частного участника, но я не думаю, что это было бы гладкое решение, так как объем данных увеличится до точки, где это может повлиять на скорость программы.

1 Ответ

0 голосов
/ 11 октября 2018

Итак, мой вопрос таков: если я хочу поделиться всеми этими данными из одного класса в другой, не позволяя получателю изменять данные (доступ только для чтения), существует ли более распространенная практика для этого, а нечем использовать постоянные указатели на данные?

Совместное использование через const-указатели - это хорошо, хотя совместное использование const-ссылки (т. е. const std::vector<Player> &) может быть весьма предпочтительным, хотя бы потому, что любой код, получающийconst-reference может быть на 100% уверен, что любая полученная ссылка не равна NULL, поскольку ссылки NULL не допускаются языком (тогда как указатели NULL допускаются).

Еще одна вещь, которую следует учитывать, это object-проблемы времени жизни - т.е. если вы передаете const std::vector<Player>* в ваш класс MainWindow, а класс MainWindow сохраняет копию этого значения-указателя (т.е. копирует переданный указатель в локальную переменную-член), итогда вектор будет уничтожен, MainWindow останется с висящим указателем, который вызовет неопределенное поведение (то есть, вероятно, сбой или, что еще хуже, молча испортит вашпространство памяти программы в некоторой очень трудной для отладки форме), если / когда она когда-либо пытается разыменовать указатель.Если вы хотите избежать какой-либо возможности такого фиаско, вы можете вместо этого передать данные через смарт-указатель (т. Е. Либо shared_ptr , либо, если вы предпочитаете использовать API, специфичные для Qt, то QSharedPointer или QPointer объект)

...