Как вывести значения динамических массивов из массива контейнера в c ++? - PullRequest
0 голосов
/ 28 марта 2012

Сначала я попытаюсь объяснить мою ситуацию.У меня есть класс со структурой внутри него, и массив этого контейнера calss

class A
{
    struct B
    {
        int I;
        B *next;
    };

    B *objOfB; //Array of structures
    B *lastB;  //Pointer to last objOfB element

public:
    //Method for adding values to objOfB
    void addB(int i)
    {
        B *temp = new B;
        temp->I = i;
        temp->next = NULL;
        if(ing == NULL)
        {
            last = temp;
            objOfB = temp;
        }
        else
        {
            last->next = temp;
            last = temp;
        }
    }
};

Массив объекта используется в файле некоторых функций

A * objA = A[100];

То, что я не могу понять, какпередать одно значение objOfB.Есть простой пример, который будет идти от начала до конца objOfB.

for (B *temp = objOfB; temp != NULL; temp = temp->next) {
  cout << temp->I << endl;
}

Я хотел бы выполнить этот цикл в файле функций, но я не могу придумать метод, который не возвращает все objOfB (используется в первой части цикла B *temp = objOfB;).Вот методы, которые я создал для выполнения этого цикла:

B listOfBs() { return *objOfB;  }
B toNextB() { return *objOfB->next; }
bool noLastB(){ return objOfB->next != NULL; }

И как это работает, его можно использовать в цикле:

for (B *temp = listOfBs(); noLastB(); temp = toNextB()) {
  cout << temp->I << endl;
}

Однако я понимаю, что все 3 методане подходит для этой петли.Поэтому мне нужен какой-то метод для возврата значения, а другой - чтобы сказать, что следует прочитать следующее значение ... Надеюсь, не яснее, чего я пытаюсь достичь.

Как передать метод класса динамических массивов класса контейнера с помощью метода?

1 Ответ

0 голосов
/ 22 марта 2013

Насколько я понимаю, у вас есть класс A (который представляет собой оболочку односвязного списка), и в него вложено простое struct B:

struct B
{
    int I;
    B *next;
};

, и вам нужен классA для предоставления интерфейса, который обеспечил бы более простой способ итерации по этому списку.

Сначала этот элемент данных очень запутан:

B *objOfB; //Array of structures

, так как вы лечитеэто как указатель на первый элемент.Хорошим началом было бы переименовать его в: B *head; Так что теперь каждый экземпляр B может указывать на элемент next, и у вас есть указатель на head, последний элемент - это элемент с next, равнымNULL, вам не нужно B *lastB;.

Тогда вы поймете, что методы, которые вы пытались предоставить, не имеют большого смысла:

B listOfBs() { return *head;  }
B toNextB() { return *head->next; }
bool noLastB(){ return head->next != NULL; }

нет причин, почемуэти методы должны возвращаться по значению, и поскольку определение struct B должно быть видимым для вызывающей стороны в любом случае.Ради принципа KISS просто сделайте head открытым элементом данных A и переименуйте A в более осмысленное имя, например MyList.Затем позвольте звонящему сделать это:

MyList list;
...
for (B* b = list.head; b != NULL; b = b->next) {
    ...
}
...