指向外层C ++

时间:2012-09-04 21:14:24

标签: c++ pointers scope hierarchical-data

在这里,我试图创建一个第N级层次结构,但不要让我指向内部类的外部类并获得访问冲突错误。但后一版本有效。

我的错误是什么?这是关于新创建的内循环的范围吗?但它们是在课堂内创建的,所以它不应该是问题吗?

 // atom.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
#include<stdlib.h>

class a
{
public:
    int x;
    a * inner;
    a * outer;
    a(int n)   //creates an inner a
    {
        n--;
        x=n;    
        if(n>0){inner=new a(n);}else{inner=NULL;}   
        inner->outer=this;//Unhandled exception at 0x004115ce in atom.exe: 0xC0000005:
                          //Access violation writing location 0x00000008.
    }

};

int main()
{
    a * c=new a(5);
    a * d=c;
    while((d->inner))     //would print 4321 if worked
    {
        std::cout<<d->x;
        d=d->inner;
    }
    getchar();
    delete c;
    d=NULL;
    c=NULL;
    return 0;
}

但这有效:

// atom.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
#include<stdlib.h>

class a
{
public:
    int x;
    a * inner;
    a * outer;
    a(int n)   //creates an inner a
    {
        n--;
        x=n;    
        if(n>0){inner=new a(n);inner->outer=this;}else{inner=NULL;} 
        //works without error
    }

};

int main()
{
    a * c=new a(5);
    a * d=c;
    while((d->inner))     //prints 4321
    {
        std::cout<<d->x;
        d=d->inner;
    }
    getchar();
    delete c;
    d=NULL;
    c=NULL;
    return 0;
}

你认为当我删除c时,它们都是自动删除吗?

2 个答案:

答案 0 :(得分:4)

执行此操作时:

if(n>0)
{
   inner=new a(n); //first n is 4, then 3,2,1 and then 0
}
else
{
   inner=NULL;
}   
inner->outer=this;

条件n>0最终不会成立(在第5次调用时),因此inner将为NULL,然后当您尝试时,您会陷入未定义的行为(以及崩溃)取消引用它(inner->outer)。

答案 1 :(得分:1)

这一行:

inner->outer=this

需要位于if (n > 0)行之后的inner = new a(n)行内,例如:

a(int n) : inner(0), outer(0) // set data members here
{
    x = --n;
    if (n > 0) {
        inner = new a(n);
        inner->outer = this;
    }
}

如上所述,当n == 0尝试设置NULL->outer = this时,保证会出现空指针异常。