通过引用c ++传递指针

时间:2014-07-20 18:37:06

标签: c++ static pass-by-reference pass-by-pointer

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

我的课程如下:

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

结果:Page

预期结果:PCam

我的课程:

页:

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

段Pmain:

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

PCAM:

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

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

1 个答案:

答案 0 :(得分:1)

您的问题或其中之一是:

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

是本地堆栈变量。当此函数返回时,它将不复存在。 如果您已将其指定给指针,则可以使用它来获取未定义的行为

  

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

除非你有某些具体原因,否则这是一个毫无意义的目标。如果需要指向堆栈对象的指针(即,未动态分配的对象),只要使用指针,该对象就必须保留在作用域中。如果你不能这样做,那么你需要把它放在堆上(即动态分配)。