2012-09-04 63 views
0

在這裏,我試圖創建一個第N級別的層次結構,但不讓我指向內部類的外部類並獲取訪問衝突錯誤。但後者版本工作。指向外層C++

我的錯誤是什麼?這是關於新創建的內部循環的範圍嗎?但是它們是在課堂內部創建的,所以它不應該成爲問題嗎?

// 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; 
} 

你覺得一切又都自動deletet當我剛剛刪除C?

+0

你的經驗會導致懷疑這種* auto * -deletion功能? –

+0

他們開始自動destruting,直到他們到達NULL?也許? –

回答

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次電話),所以innerNULL,然後你欠幅爲未定義行爲(和崩潰)當您嘗試解除引用(inner->outer)。

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

+0

感謝您的回答 –