Доступ к массиву объектов с помощью указателя - PullRequest
0 голосов
/ 29 февраля 2012

Это мой пример программы

#include "stdafx.h"

class B
{
public:
    int i,j;
};

class A
{
public:
    B b[2];
    A()
    {
        b[0].i = 1;
        b[0].j = 2;
        b[1].i = 3;
        b[1].j = 4;
    }
    B* function()
    {
        return b;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    B* obj = new B();
    obj = a.function();
    return 0;
}

Мне нужно получить массив объектов b (т. Е. Нужны все значения, b [0] .i, b [0] .j, b [1] .i и b [1] .j)

Но когда я попробовал это с этим кодом, возвращался только один объект.

Ответы [ 3 ]

1 голос
/ 29 февраля 2012

Этот код

B* function()
        {
          return b;
        }

возвращает указатель на первый элемент массива

B b[2];

, который может быть разыменован с помощью арифметики указателя и / или оператора [].

1 голос
/ 29 февраля 2012

Да, вы фактически возвращаете указатель на массив b [2].Что вы хотите сделать сейчас, это перебирать элементы в этом указателе.Вы можете распечатать их, добавив следующие строки в свой код:

A a;
B *obj = a.function();
std::cout << obj[0].i << ", " << obj[0].j << "; " << obj[1].i << ", " << obj[1].j << std::endl;

И, конечно, включая iostream в начале вашего файла:

#include <iostream>
1 голос
/ 29 февраля 2012

То, что вы заявляете в вопросе, не соответствует действительности.Два объекта действительно возвращены.Получите к ним доступ с помощью obj[0] и obj[1].

Я полагаю, вы смотрите на obj в отладчике, и среда IDE не может знать, что вы подразумеваете, что указатель obj представляет собой массив из двух объектов,Так что во всплывающих подсказках будет отображаться только первый объект, obj[0] или *obj.Но другой объект, obj[1], определенно существует.

Добавьте следующую строку после вызова к a.function:

printf("%d, %d, %d, %d\n", obj[0].i, obj[0].j, obj[1].i, obj[1].j);

, и вы увидите этот вывод:

1, 2, 3, 4

Обратите внимание, что в строке B* obj = new B(); нет никакого смысла, поскольку вы сразу перезаписываете obj.Вы должны сделать это следующим образом:

B* obj = a.function();

Ваш код также немного опасен тем, что вы должны поддерживать a как минимум, пока вы ссылаетесь на obj.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...