C++ 类指针

C++ 类指针,c++,class,pointers,C++,Class,Pointers,代码: 我唯一能绕过这个问题的方法是: Unhandled exception at 0x00BF45FB in Nglarsen.Hmwk.3.Assignment.exe: 0xC0000005: Access violation writing location 0xBAADF00D. Block**blockArray=newblock*[numBlocks]; 对于(int i=0;i a>>b; 块数组[i][j].setPosX(a); 块阵列[i][j].setPosY(b);

代码:

我唯一能绕过这个问题的方法是:

Unhandled exception at 0x00BF45FB in Nglarsen.Hmwk.3.Assignment.exe: 0xC0000005: Access violation writing location 0xBAADF00D.
Block**blockArray=newblock*[numBlocks];
对于(int i=0;i a>>b;
块数组[i][j].setPosX(a);
块阵列[i][j].setPosY(b);
}
}
但我知道有更好的方法让我忘记一些事情。
提前感谢

假设
符合vector的要求,我会这样做

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);            

    }
}
std::向量块(numblock)
用于(自动和块:块)
{
fin>>a>>b;
block.setPosX(a);
块。塞波西(b);
}

请注意内存严重不足。

您正在分配一个指针数组,但这些指针不指向任何东西,您需要再次迭代它们,并在它们上分配真实对象

std::vector<Block> blocks(numBlocks)
for (auto& block : blocks)
{
    fin >> a >> b;
    block.setPosX(a);
    block.setPosY(b);
}
Block**blockArray=newblock*[numBlocks];
对于(inti=0;i>a>>b;
块阵列[i]->setPosX(a);
块阵列[i]->setPosY(b);
}
假设您需要二维局部阵列:

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=newblock*[numBlocks];
对于(int i=0;i a>>b;
块阵列[i][j]->setPosX(a);
块阵列[i][j]->setPosY(b);
}        
}
显而易见的“更好的方法”是使用
std::vector
来代替。由于您正在输入
对象,通常通过重载
操作符>
来直接支持这一点最干净,而不是要求所有代码都知道其内部细节

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);  
        }        
}
std::istream&operator>>(std::istream&is,Block&Block){
INTA,b;
是>>a>>b;
block.setPosX(a);
块。塞波西(b);
回报是;
}
std::向量块;
块。保留(数量锁);
std::copy_n(std::istream_迭代器(fin)、numBlocks、std::back_插入器(块));

在第一种情况下取消对未初始化指针的引用:
blockArray[i]->setPosX(a)
。你为什么要使用
new
呢?我宁愿推荐使用
std::vector
。我认为没有必要在这种情况下使用
new
。那么,应该如何准确地创建对象呢?不知从何而来?他们怎么不告诉他如何解决他的问题?他们不仅做了他需要的事情,而且不会泄漏内存,而且他们是更高效。一切都在标准库中。使用它。有什么区别吗?你只是在玩弄文字。拥抱标准库。不要反抗它。它对你有好处。标准库不是一切的替代品——但它确实为手头的工作提供了一个专门的工具——它是一个比fli芯片更好的工具你的答案中已经显示了。我会研究向量,我还没有学习它们。谢谢你的帮助。顺便说一句,为什么这个问题被否决了这么多?这只是一个愚蠢的问题吗?@Skathix我不知道。好吧,谢谢你的帮助,我很确定你过去确实帮助过我。我显然是个学生,有时事情不像我希望的那样顺利
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);  
        }        
}
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));