gpt4 book ai didi

c++ - 无法调用指针的打印函数

转载 作者:太空宇宙 更新时间:2023-11-04 15:40:59 25 4
gpt4 key购买 nike

我一直被我正在做的一些家庭作业难住了。

我正在研究一个名为“boxFactory”的函数,它将 Box 基类的指针返回到测试类。然后测试类从该指针调用打印函数。

现在我正在尝试在处理其他类型之前打印方格框。但是,当我运行下面的代码时,会在 bptr->print(os) 处抛出异常,内容如下:

“Assignment.exe 中 0x0091C512 处的未处理异常:0xC0000005:访问冲突读取位置 0xCCCCCCD0。”

Box * boxFactory(char c, int w, int h){

Box * b;

if(c == 'c')
{
CheckeredBox cb;
b = &cb;
b->setHeight(h);
b->setWidth(w);

return b;
}

return NULL;
}

测试类的代码片段:

Box * bptr = boxFactory('c',5,3);

// Check print #7
os.str(""); //reset output holder
bptr->print(os);
t.test(os.str() == "x x x\n x x \nx x x\n", "print 5x3 checkered box from factory");

派生的 Checkered 类的打印函数:

ostream& CheckeredBox::print(ostream& os) const
{
//HEIGHT for loop
for (int i = 0; i < height_; i++)
{
bool isX; //is current space x or blank

//makes the every other line starts
if (i % 2 == 0)
{
isX = true;
}
else
{
isX = false;
}

//WIDTH for loop
for (int c = 0; c < width_; c++)
{
if (isX) //utilizes isX boolean
{
os << "x";
isX = false; //oscilates bool between spaces
}
else
{
os << " ";
isX = true; //continues oscilation
}
}

os << "\n"; //append new line after each row
}

return os;

}

最佳答案

您在 boxFactory 函数中创建了 CheckeredBox 对象的自动实例。因此,当 cb 对象超出范围(如果阻塞)时,它将被破坏并且您将返回被破坏对象的地址。这就是为什么当您尝试调用此指针的打印方法时会出现“访问冲突”错误。以下是您可以执行的操作以完成您想要的。

您需要使用 new 关键字在堆上构造 CheckeredBox 对象,然后从 boxFactory 函数返回它。在这种情况下,您的应用程序可以运行,但问题仍然是谁应该删除您在堆上创建的对象。您可以在函数文档中指定调用者应删除返回的对象,但如果您或使用您的代码的其他人不够小心,您的应用程序很可能会泄漏内存。您可以使用 std::auto_ptr 获取和转移对象的所有权,以便自动删除它。

std::auto_ptr<Box> boxFactory(char c, int w, int h){
std::auto_ptr<Box> b;

if(c == 'c')
{
CheckeredBox *cb = new CkeckeredBox();
cb->setHeight(h);
cb->setWidth(w);
b.reset(cb);
}

return b;
}

考虑到 auto_ptr 在新的 C++11 标准中被弃用,您可以使用 boost::shared_ptr、std::unique_ptr(仅限 C++11)或 std::shared_ptr(仅限 C++11)。

关于c++ - 无法调用指针的打印函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23213703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com