[英]C++ Array Of Pointers
在C ++中,如果我想要一个指针数组,以便我可以让它们在后一阶段指向不同的对象,那么语法是什么样的。
编辑
我想澄清一下我想做什么。 我有一个类foo,它有和添加方法。 在add方法中,我引用了类栏。 我想将该引用保存到bar的指针数组中。 指针栏数组需要一直扩展,这样我就没有问题了。 它是在指针堆上创建和数组,以便我稍后可以为它们分配bar对象。 我试过的似乎失败了,因为类bar没有编译器抱怨的默认构造函数。 这让我想到我正在创建一些我不想做的实际对象。
请不要,我不想听到你认为这是多么疯狂等等,这是你的意见。
你想要的是:
Foo *array[10]; // array of 10 Foo pointers
不要混淆:
Foo (*array)[10]; // pointer to array of 10 Foos
在任何一种情况下,都不会自动初始化任何内容,因为它们表示尚未分配给某些东西的Foos指针(例如,使用new)。
当我意识到它描述了你如何访问基类型时,我终于在C中“得到”了指针/数组声明语法。 Foo *array[5][10];
表示*array[0..4][0..9]
(在5个项目的数组上的下标,然后在10个项目的数组*array[0..4][0..9]
标,然后作为指针取消引用)将访问Foo对象(注意[]
优先级高于*
)。
这似乎是倒退。 你会认为int array[5][10];
(又名int (array[5])[10];
)是一个10 int array[5]
。 假设是这种情况。 然后你可以通过说array[9][4]
来访问数组的最后一个元素。 这不是倒退吗? 因为C数组声明是指示如何到达基类型的模式(而不是像人们期望的那样的数组表达式的组合),所以不必对数组声明和使用数组的代码进行翻转。
例如,如果你想要一个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;
}
我会按照以下方式做点什么:
class Foo{
...
};
int main(){
Foo* arrayOfFoo[100]; //[1]
arrayOfFoo[0] = new Foo; //[2]
}
[1]这使得一个包含Foo对象的100个指针的数组。 但实际上并没有创建Foo对象。
[2]这是一种实例化对象的可能方法,同时在数组的第一个位置保存指向此对象的指针。
如果你不使用STL,那么代码看上去有点像C.
#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
可以是任何POD类型,包括指针。
请注意, arr
必须由malloc
分配,而不是new[]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.