繁体   English   中英

C ++指针数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM