对象数组,c ++

时间:2010-10-19 13:53:16

标签: c++ pointers function parameters

我有两个班级,FlightRunway。现在我试图将这些对象的数组作为参数传递给函数。

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

ptr1应指向Flight对象数组,ptr2应指向Runway对象数组。 现在在这个函数fun()里面如何访问这些类的成员。我也可以使用ptr1 ++或ptr2 ++在对象之间移动?? 我怎么称呼这个函数?这样的事情 -

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

7 个答案:

答案 0 :(得分:4)

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 :(得分:1)

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

答案 2 :(得分:0)

在函数中,它们下拉到指针,因此您可以使用ptr1 ++或++ ptr1和ptr2 ++ / ++ ptr2移动到数组中的下一个项目。

我不确定你的函数如何知道数组中有多少项,因为它无法从代码本身告诉你所以你需要一些“终结器”对象或者将这个大小作为额外参数传递。 / p>

如果你(因为可取)使用了std :: vector,那么你可以将一个引用或const引用传递给你的函数,然后你就可以迭代遍历向量,直到你到达结束迭代器,然后你也可以询问矢量的大小。

答案 3 :(得分:0)

使用ptr1 [i],其中i是一个偏移量,它以指向Flight Class的指针的大小递增。由于数组未在C ++中进行边界检查,因此您的函数必须以某种方式知道数组的大小。另外,远离像ptr ++这样的指针运算,你可能会遇到麻烦。

答案 4 :(得分:0)

在C ++中,参数列表

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

完全等同于

void fun(Flight* ptr1, Runway* ptr2)

你可以使用像数组这样的参数,正如Fred所说:

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

你也可以使用++和 - 因为它们是指针:

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

除非将数组作为单独的参数传递,否则无法判断该数组有多长。

答案 5 :(得分:0)

下面是示例程序,我已经定义了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函数中获得数组的大小,并且无法在运行时计算sizeof数组,所以你应该在fun函数中添加额外的参数来获取每个数组的大小。

是的,您可以将指针算法应用于Flight / Runway数组。

乐趣(Flight ptr1 [])相当于fun(Flight * ptr1)。

答案 6 :(得分:0)

除非没有别的办法,否则不要使用这样的数组。请改用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);

这种方式好多了。