0

ここでは、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 を削除するだけで、それらはすべて自動削除されると思いますか?

4

2 に答える 2

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

于 2012-09-04T21:17:39.440 に答える
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

于 2012-09-04T21:18:56.647 に答える