类指针指针

时间:2015-03-29 14:12:57

标签: c++ class pointers

代码:

Block** blockArray = new Block*[numBlocks];
for (int i=0; i<numBlocks; i++)
{

        fin >> a >> b;
        blockArray[i]->setPosX(a);
        blockArray[i]->setPosY(b);          

}

问题:

当代码命中了blockArray [i] - &gt; setPosX(a)时; 它引发了一个未处理的异常。具体做法是:

Unhandled exception at 0x00BF45FB in Nglarsen.Hmwk.3.Assignment.exe: 0xC0000005: Access violation writing location 0xBAADF00D.

我能够解决这个问题的唯一方法是:

Block** blockArray = new Block*[numBlocks];
for (int i=0; i<numBlocks; i++)
{
    blockArray[i]=new Block[1];
    for(int j=0;j<1;j++)
    {
        fin >> a >> b;
        blockArray[i][j].setPosX(a);
        blockArray[i][j].setPosY(b);            

    }
}

但我知道有一种更好的方式我只是忘了这里的东西。 提前致谢

3 个答案:

答案 0 :(得分:3)

假设Block符合向量的要求,我会这样做。

std::vector<Block> blocks(numBlocks)
for (auto& block : blocks)
{
    fin >> a >> b;
    block.setPosX(a);
    block.setPosY(b);
}

请注意精确缺少内存泄漏。

答案 1 :(得分:3)

你正在分配一个指针数组,但是这些指针指向什么,你需要再次迭代它们,并在它们上分配实际对象。

Block** blockArray = new Block*[numBlocks];

for (int i=0; i<numBlocks; i++)
{
        blockArray[i] = new Block();
        fin >> a >> b;
        blockArray[i]->setPosX(a);
        blockArray[i]->setPosY(b);          

}

假设你想要二维数组:

Block** blockArray = new Block*[numBlocks];

for (int i=0; i<numBlocks; i++)
{
        blockArray[i] = new Block[SIZE];
        for (int j =0 ;j<SIZE;j++){
           blockArray[i][j] = new Block();
           fin >> a >> b;
           blockArray[i][j]->setPosX(a);
           blockArray[i][j]->setPosY(b);  
        }        
}

答案 2 :(得分:1)

明显的“更好的方法”是使用std::vector代替。由于您正在输入Block个对象,因此通常可以通过重载operator>>来直接支持它,而不是要求所有代码都知道其内部细节。

std::istream &operator>>(std::istream &is, Block &block) { 
    int a, b;
    is >> a >> b;
    block.setPosX(a);
    block.setPosY(b);
    return is;
}

std::vector<Block> blocks;
blocks.reserve(numBlocks);
std::copy_n(std::istream_iterator<Block>(fin), numBlocks,std::back_inserter(blocks));