C++数组指针
在C++中,如果我想要一个指针数组,以便我可以让它们在后一阶段指向不同的对象,那么语法看起来像什么。C++数组指针
编辑
我需要澄清我想要做的事我猜。我有一个拥有和添加方法的类foo。在add方法中,我引用了一个类栏。我想将该引用保存到条形指针数组中。指针栏数组需要一直扩展,这是我没有任何问题。它在指针堆上创建和排列,以便稍后可以将bar对象分配给它们。我所尝试过的似乎失败了,因为类栏没有编译器正在抱怨的默认构造函数。这导致我认为我正在创建和我不想做的实际对象的数组。
请不要stl和不,我不想听到你认为这是疯狂的等等,这是你的意见。
例如,如果你想要一个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;
}
不要忘记实现(或声明为私有)复制操作符,请参见[三个规则](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数组声明是指示如何到达基本类型(而不是数组表达式,如人们可能期望的那样)的模式,所以使用数组的数组声明和代码不必被翻转。
+1是的,一旦你了解它们,C声明实际上是有意义的:) – fredoverflow 2010-05-21 06:18:59
对于未来这个问题的访问者:你可以使用[像这样的工具](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.
请注意,arr
必须由malloc
分配,而不是new[]
。
这并不严格回答你的问题,但在大多数情况下,它会更好地使用指针数组。例如std :: vector集合; –
2010-05-21 05:08:20
“foo对象没有实际的初始化”是什么意思?另外,你知道在编译时本身有多少个元素? – Naveen 2010-05-21 05:20:01
你到目前为止制作了哪些代码? – Default 2010-05-21 06:38:05