массив объектов, c ++ - PullRequest
       18

массив объектов, c ++

0 голосов
/ 19 октября 2010

У меня есть два класса, а именно Flight и Runway.Теперь я пытаюсь передать массив этих объектов в качестве параметра функции.

void fun(Flight ptr1[],Runway ptr2[])
{
...
...
}

ptr1 должен указывать на массив объектов Flight, а ptr2 должен указывать на массив объектов Runway. Теперь внутри этой функции fun () как мне получить доступ к членам этих классов,Также я могу использовать ptr1 ++ или ptr2 ++ для перемещения между объектами ??Кроме того, как бы я назвал этот функционал как-то так -

Flight array1[5];
Runway array2[2];
fun(array1,array2);

Ответы [ 7 ]

4 голосов
/ 19 октября 2010
void fun(Flight ptr1[],Runway ptr2[])

интерпретируется как

void fun(Flight *ptr1, Runway *ptr2)

Это называется "разложение", и я думаю, что оно гнилое. В основном это функция обратной совместимости с C. Если вам нужны указатели, укажите указатели, а не массивы, потому что указатели и массивы - это разные вещи.

Вы также можете сделать

void fun(Flight (&arr1)[5], Runway (&arr2)[7])

Теперь параметры остаются массивами внутри функции, а не указателями, поэтому ++ arr1 недопустимо и sizeof arr1/sizeof arr1[0] равно 5. Массивы аргументов при вызове функции также должны иметь правильный размер, ровно 5 и 7 соответственно. В этом контексте & означает передачу по ссылке, поэтому массивы не копируются при вызове функции.

Вы также можете использовать систему шаблонов для генерации функции для массива аргументов любого размера:

template< size_t NF, size_t NR >
void fun(Flight (&arr1)[NF], Runway (&arr2)[NR])

Такой шаблон можно вызывать с массивами любого размера, и NF и NR будут целочисленными константами, установленными на соответствующие размеры.

1 голос
/ 19 октября 2010
ptr1[5].fly();
ptr2[7].run();
0 голосов
/ 19 октября 2010

Не используйте подобные массивы, если нет другого пути. Используйте std::vector вместо:

void fun( const std::vector<Flight> &flights, const std::vector<Runway> &runways)
{
...
...
}

И для вызова функции:

std::vector<Flight> flights(5);
std::vector<Runway> runways(2);
fun(array1,array2);

Так намного лучше.

0 голосов
/ 19 октября 2010

Ниже приведен пример программы, в которой я определил класс Flight для демонстрации доступа к члену класса Flight.

#include <stdio.h>
#include <iostream>
#include <new>
using namespace std;

class Flight {
public:
    int temp;
    int temp1;

    Flight();
    void print();
};

Flight::Flight() {
    temp = 10;  
    temp1 = 11; 
}

void Flight::print() {
    printf("%d %d\n", temp, temp1);
}

void fun(Flight ptr1[]) {
    //ptr1->print();
    ptr1[0].print();
    ptr1[1].print();

    printf("temp=%d\n",ptr1[0].temp);
    printf("sizeof %d \n",sizeof(ptr1));
}

int main() {
    Flight array1[5];

    Flight *p = new Flight;
    //fun(p);
    fun(array1);

    return 0;
}

Вы не можете получить размер массива в функции fun, и нет способа вычислить размер массива во время выполнения, поэтому вам нужно добавить дополнительный параметр в функцию fun для получения размера каждого массива.

Да, вы можете применить арифметику указателя к массиву Flight / Runway.

Веселье (Flight ptr1 []) эквивалентно веселью (Flight * ptr1).

0 голосов
/ 19 октября 2010

В C ++ список аргументов

void fun(Flight ptr1[],Runway ptr2[])

в точности эквивалентен

void fun(Flight* ptr1, Runway* ptr2)

Вы можете использовать аргументы как массивы, как сказал Фред:

ptr1[5].fly();
ptr2[7].run();

и вы также можете использовать ++ и - потому что они являются указателями:

Flight& FirstFlight = *ptr1;
ptr1++;
Flight& SecondFlight = *ptr1;
Flight& ThirdFlight = ptr1[1];

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

0 голосов
/ 19 октября 2010

используйте ptr1 [i], где i - смещение, которое увеличивается на размер указателя на класс полета.Поскольку в C ++ массивы не проверяются по границам, ваша функция должна каким-то образом знать размер массива.Кроме того, держитесь подальше от выполнения арифметики с указателями, как ptr ++, вы можете попасть в неприятности таким образом.

0 голосов
/ 19 октября 2010

Внутри функции они раскрываются до указателей, поэтому вы можете использовать ptr1 ++ или ++ ptr1 и ptr2 ++ / ++ ptr2 для перехода к следующему элементу в вашем массиве.

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

Если вы (как желательно) использовали std :: vector, тогда вы можете передать ссылку или const-ссылку на свой вектор в свою функцию, и с этого момента вы можете выполнять итерацию по вектору, пока не достигнете конечного итератора, и вы Можно также запросить размер вектора.

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