0

是的,我已经阅读了很多教程和问题,也尝试了很多组合,但似乎不起作用。我的目标是不使用动态分配。

我的课程如下所示:

Pages
Page
PMain:Page
PCam:Page

当我这样做时,主要是:

1.主要:

Page * page;
PCam main;
main.setContext(context);
page = &main;
page->echo();

结果:PCam

但是当我尝试在外部类中创建实例并将其指向页面时,它会失败。

2.

页面类:

Pages::Pages(Page*& page, Context& context){
    this->context = &context;
    PMain main;
    main.setContext(*this->context);
    main.echo();
    // page = &main; <---
} 

主要的:

Page * page;
Pages pages(page, context);
page->echo();

结果:页面

预期结果:PCam

我的课程:

页:

void Page::setContext(Context & context)
{
    this->context = &context;
}
void Page::echo()  //virtual
{
    std::cout << "echo Page"  << std::endl;
}

主:

void PMain::echo(){
    std::cout << "echo PMain"  << std::endl;}
}

电脑摄像头:

void PCam::echo(){
    std::cout << "echo PCam"  << std::endl;}
}

任何帮助,将不胜感激。谢谢。

4

1 回答 1

1

您的问题或其中一个问题是:

Pages::Pages(Page*& page, Context& context){
    [...]
    PMain main;

是一个局部堆栈变量。当这个函数返回时,它就不再存在了。如果您已将其分配给指针,则使用它会得到未定义的行为

我的目标是不使用动态分配。

除非您有特定的原因,否则这几乎是毫无意义的目标。如果您想要一个指向堆栈对象的指针(即,不是动态分配的),只要您使用该指针,该对象就必须保持在范围内。如果你不能这样做,那么你需要把它放在堆上(即动态分配)。

于 2014-07-20T18:48:39.980 回答