2010-10-19 172 views
0

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

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

PTR1应指向飞行物体和PTR2的阵列应指向跑道对象的数组。 现在在这个函数里fun()如何访问这些类的成员。我也可以使用ptr1 ++或ptr2 ++在对象之间移动? 此外,我怎么会调用这个FUNC?这样的事情 -

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

你可以像索引数组一样索引指针:)像ptr1 [0],ptr1 [1]等 – 2010-10-19 14:01:03

+2

如果你这样做,不要在Flight或Runway上使用多态。在你说出aw之前,你会先在脚下开枪。 – Jan 2010-10-19 14:27:58

+6

你有使用数组而不是'std :: vector'的原因吗? – outis 2010-10-19 14:42:50

回答

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
ptr1[5].fly(); 
ptr2[7].run(); 
+2

跑道类有一个run()? :D – 2010-10-19 14:05:04

+2

Armen:是的,逃离所有试图骚扰它的飞机;-) – fredoverflow 2010-10-19 16:48:42

0

在函数他们下降到指针,这样你就可以使用PTR1 ++或++ PTR1和PTR2 ++/++ PTR2移动到数组中的下一个项目。

我不知道你的函数如何知道数组中有多少项,因为它不能从代码本身知道,所以你需要一些“终结器”对象或将大小作为额外参数传递。

如果你(更可取的)使用std :: vector,那么你可以传入一个引用或const引用到你的向量到你的函数中,并且你可以遍历向量直到你到达结束迭代器,并且你也可以询问矢量的大小。

0

使用ptr1 [i]其中i是按照指向Flight Class的指针的大小递增的偏移量。由于数组不是在C++中进行边界检查的,因此函数将不得不知道数组的大小。另外,远离像ptr ++这样的指针运算,你可能会以这种方式陷入困境。

0

在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

下面是示例程序,我已经定义了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; 
} 

你不能得到数组的大小的乐趣功能,并没有办法计算在运行时的sizeof数组,所以你应该在的乐趣功能获得的sizeof每个阵列增加额外的参数。

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

有趣的(Flight ptr1 [])等同于fun(Flight * ptr1)。

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); 

好多了这种方式。

+0

更好的是通过const引用传递这些向量...... – 2010-10-19 18:42:26