C++指针数组

28

在C++中,如果我想要一个指针数组,以便我可以在后期将它们指向不同的对象,语法应该是怎样的。

编辑

我需要澄清一下我的意图。我有一个名为foo的类,其中包含一个add方法。在add方法中,我会引用bar类的一个对象。我想把这个引用保存到一个bar指针数组中。这个指针数组需要随时扩展,这一点我没有问题。它是在堆上创建指针数组,以便我稍后可以将bar对象分配给它们。我尝试过的方法似乎失败了,因为bar类没有默认构造函数,编译器正在抱怨。这让我认为我正在创建实际对象的数组,而我不想这样做。

请不要使用stl,也不要告诉我你认为这很疯狂之类的,那只是你的观点。


1
这并不严格回答你的问题,但在大多数情况下,最好使用指针数组。例如:std::vector<BaseObjectType *> collection; - Conspicuous Compiler
“no actual initialization of foo objects” 是什么意思?另外,你知道编译时数组中有多少元素吗? - Naveen
你目前已经编写了哪些代码? - default
3
“没有STL,不要告诉我你认为这很疯狂之类的东西,那只是你的观点。” - 你真的意识到这听起来既无知又傲慢吗?你可能有拒绝STL的充分理由 - 但为什么不直接告诉我们,以便缩短这一切呢? - Konrad Rudolph
5个回答

64

你所需要的是:

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

请勿与以下内容混淆:

Foo (*array)[10]; // pointer to array of 10 Foos
无论哪种情况,都不会自动初始化,因为这些代表指向尚未分配任何内容(例如使用new)的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
10
给未来的访问者:您可以使用类似这样的工具(http://cdecl.org/)将这些声明翻译成类似英语的东西,以更好地理解变量的声明方式。请注意,这只是一个翻译工具,不一定完全准确。 - Sumurai8

10
例如,如果你想要一个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;
}

不要忘记实现(或声明为私有)复制运算符,请参阅三法则 - basic6

4
我会按照以下方式进行操作:

我会这样做:

class Foo{
...
};

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

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

[1] 这将创建一个包含100个指向Foo对象的指针的数组。但实际上并没有创建任何Foo对象。

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


3
如果你不使用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[]



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接