Параметр C ++ является указателем на постоянный объект, но обновленный объект не возвращается? - PullRequest
2 голосов
/ 25 октября 2011

У меня есть собственный класс C ++ SrcClass, содержащий следующее:

std::vector<shotEntry> objectsQueue;

bool getRelatedEntry(const entryToProcess *entriesDeets, int &i) const {
    if (i >= (int)objectsQueue.size()) {
        i = 0;
        return false;}
    if (!objectsQueue.size()) return false;
    entriesDeets = &(objectsQueue[i++]);
    return true;
}

В моем клиенте у меня есть:

const entryToProcess *entriesDeets = NULL;
int i = 0;
while (srcObj->getRelatedEntry(entriesDeets, i)) {

Когда я выполняю getRelatedEntry формальный параметр,entriesDeets обновляется, как ожидается, прежде чем вернуться.Когда он возвращает, фактический параметр клиента не обновляется.

Это в каком-то большом проекте, к которому я вернулся через два месяца.Я почти уверен, что последним рефакторингом, который я сделал, было введение этих проклятых vectors.Сборка занимает много времени, когда я связываюсь с заголовками.Я запутался с инициализацией один раз / только для чтения / const'ness C #?Могу ли я сойти с рук, когда клиент получит обратно только для чтения собственный объект?

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

Это потому, что вы устанавливаете значение параметра функции. Вы хотите:

bool getRelatedEntry(const entryToProcess **entriesDeets, int &i) const {
    ...
    *entriesDeets = &(objectsQueue[i++]);
    ...

и

srcObj->getRelatedEntry(&entriesDeets, i)
3 голосов
/ 25 октября 2011

recordsDeets - это локальная переменная внутри getRelatedEntry.Вы только изменили локальное, вы не влияли на передаваемое значение. Вам нужно передать ссылку на указатель или указатель на указатель.

2 голосов
/ 25 октября 2011

Указатель обновлен, но это внутренняя копия внутри функции.Если вы хотите, чтобы это изменение было видно за пределами функции, вы должны передать ссылку:

//                                         v
bool getRelatedEntry(const entryToProcess *&entriesDeets, int &i) const {

Или в стиле C двойной указатель и разыменовывать его внутри при каждом использовании:

//                                         v
bool getRelatedEntry(const entryToProcess **entriesDeets, int &i) const {
   // ...
   *entriesDeets = &(objectsQueue[i++]);
...