C++数组指针

问题描述:

在C++中,如果我想要一个指针数组,以便我可以让它们在后一阶段指向不同的对象,那么语法看起来像什么。C++数组指针

编辑

我需要澄清我想要做的事我猜。我有一个拥有和添加方法的类foo。在add方法中,我引用了一个类栏。我想将该引用保存到条形指针数组中。指针栏数组需要一直扩展,这是我没有任何问题。它在指针堆上创建和排列,以便稍后可以将bar对象分配给它们。我所尝试过的似乎失败了,因为类栏没有编译器正在抱怨的默认构造函数。这导致我认为我正在创建和我不想做的实际对象的数组。

请不要stl和不,我不想听到你认为这是疯狂的等等,这是你的意见。

+1

这并不严格回答你的问题,但在大多数情况下,它会更好地使用指针数组。例如std :: vector 集合; – 2010-05-21 05:08:20

+0

“foo对象没有实际的初始化”是什么意思?另外,你知道在编译时本身有多少个元素? – Naveen 2010-05-21 05:20:01

+0

你到目前为止制作了哪些代码? – Default 2010-05-21 06:38:05

例如,如果你想要一个int指针数组,它将是int* a[10]。这意味着变量a是10 int*的集合。

编辑

我想这是你想要做什么:

class Bar 
{ 
}; 

class Foo 
{ 
public: 

    //Takes number of bar elements in the pointer array 
    Foo(int size_in); 

    ~Foo(); 
    void add(Bar& bar); 
private: 

    //Pointer to bar array 
    Bar** m_pBarArr; 

    //Current fee bar index 
    int m_index; 
}; 

Foo::Foo(int size_in) : m_index(0) 
{ 
    //Allocate memory for the array of bar pointers 
    m_pBarArr = new Bar*[size_in]; 
} 

Foo::~Foo() 
{ 
    //Notice delete[] and not delete 
    delete[] m_pBarArr; 
    m_pBarArr = NULL; 
} 

void Foo::add(Bar &bar) 
{ 
    //Store the pointer into the array. 
    //This is dangerous, you are assuming that bar object 
    //is valid even when you try to use it 
    m_pBarArr[m_index++] = &bar; 
} 
+0

不要忘记实现(或声明为私有)复制操作符,请参见[三个规则](http://stackoverflow.com/q/4172722)。 – basic6 2014-11-12 15:36:26

你想要的是:

Foo (*array)[10]; // pointer to array of 10 Foos 

Foo *array[10]; // array of 10 Foo pointers 

不要与混淆

无论哪种情况,都不会自动进行初始化,因为它们表示尚未分配给某些事物的Foos的指针(例如,与新)。

当我意识到它描述了如何访问基类型时,我终于在C语言中获得了指针/数组声明语法。 Foo *array[5][10];表示*array[0..4][0..9](5个项目的下标上的下标,然后是10个项目的数组上的下标,然后作为指针取消引用)将访问Foo对象(请注意,[]具有比*更高的优先级)。

这似乎倒退了。你会认为int array[5][10];(又名int (array[5])[10];)是10 int array[5]的数组。假设情况是这样的。然后,您可以通过说array[9][4]来访问数组的最后一个元素。那也不是回头看吗?因为C数组声明是指示如何到达基本类型(而不是数组表达式,如人们可能期望的那样)的模式,所以使用数组的数组声明和代码不必被翻转。

+0

+1是的,一旦你了解它们,C声明实际上是有意义的:) – fredoverflow 2010-05-21 06:18:59

+7

对于未来这个问题的访问者:你可以使用[像这样的工具](http://cdecl.org/)将这些声明转换成类似于英语,以更好地理解变量是如何声明的。 – Sumurai8 2013-11-19 15:42:05

我会做一些沿着这些路线:

class Foo{ 
... 
}; 

int main(){ 
    Foo* arrayOfFoo[100]; //[1] 

    arrayOfFoo[0] = new Foo; //[2] 
} 

[1]这使得100点的指针的Foo-对象的数组。但是没有Foo对象实际上被创建。

[2]这是实例化对象的一种可能方式,同时在数组的第一个位置保存一个指向此对象的指针。

如果不使用STL,那么代码看起来

#include <cstdlib> 
#include <new> 

template< class T > 
void append_to_array(T *&arr, size_t &n, T const &obj) { 
    T *tmp = static_cast<T*>(std::realloc(arr, sizeof(T) * (n+1))); 
    if (tmp == NULL) throw std::bad_alloc(__FUNCTION__); 
     // assign things now that there is no exception 
    arr = tmp; 
    new(&arr[ n ]) T(obj); // placement new 
    ++ n; 
} 

T一个很多有点像C.

可以是任何类型的POD ,包括指针。

请注意,arr必须由malloc分配,而不是new[]