2016-03-26 15 views
0

Sınıf ve object.i ile çok az sorun yaşıyorum Bu kodu var ve ben sadece kendi nesnenin adresini incitiyorum ama ne kadar artırabilir ben hala üye fonksiyonuna erişmek mümkün olursa olsun. Lütfen bana bunu yardımcı olmama yardım Düşündüğüm şeyin gerçekleşmediği var mı?Bu sınıfın nesnesi, üye işlevine hala nasıl erişebilir?

#include<iostream> 
using namespace std; 
class B 
{ 
int a,d,b,c; 
public: 
void cl() 
    { 
    int f,m,b; 
    cout<<"\nvoid cl"; 
    } 
} obj; 

int main() 
{ B *m; 

    int *i; 
    m=&obj; 
    cout<<"\nsize of obj="<<sizeof(obj); 
    cout<<"\naddress of obj "<<&obj; 
    cout<<"\nvalue of m="<<m; 
    i=new int; 
// for(int j=0;j<10;j++) 
    cout<<"\n value of i "<<*i; 
    for(int j=0;j<10;j++) 
{ m++; 
    cout<<"\nvalue of m++ "<<m++; 
    m->cl(); 
} cout<<"\n"; 
} 

ve çıkış void cl() kod nesnenin bir parçası değildir

[email protected]:~/Documents$ ./a.out 

size of obj=16 
address of obj 0x6013e0 
value of m=0x6013e0 
value of i 0 
value of m++ 0x6013f0 
void cl 
value of m++ 0x601410 
void cl 
value of m++ 0x601430 
void cl 
value of m++ 0x601450 
void cl 
value of m++ 0x601470 
void cl 
value of m++ 0x601490 
void cl 
value of m++ 0x6014b0 
void cl 
value of m++ 0x6014d0 
void cl 
value of m++ 0x6014f0 
void cl 
value of m++ 0x601510 
void cl 
[email protected]: 
+0

Kodunuz tanımlanmamış bir davranış sergiliyor, bu nedenle her şey olabilir. –

+1

Çok benzer [Boş bir işaretçi sınıf üyelerine erişme] (http://stackoverflow.com/questions/669742/accessing-class-members-on-a-null-pointer) –

cevap

2

olup. Derleyici, adresini statik olarak tanır ve main() ile diğer işlevler arasında ikili olarak yerleştirir.

Temel olarak, argüman olarak nesneye bir işaretçi kabul eden bir işlev çağırın, ancak kullanmayın.'un cl() içinde bazı alanlarına erişmeye çalıştıklarında, tanımlanmamış davranışlar elde edersiniz.

+0

Tam olarak doğru değil. 'm-> cl()', basit bir dereferencing işleviyle tanımsız bir davranış verir (m) (artırılmış bir nesneyi arttıktan sonra gösterir). Bu dereferans, yani '->' nin yaptığı şey, B :: cl() 'den önce gerçekleşir. B :: cl() 'DE, çağrısının tanımlanmamış davranışını verir, ancak bu, 'm' hata düzeltmesinden sonra gelir. Tanımsız davranış, her iki durumda da görünür bir belirtiye sahip olmak zorunda değildir. – Peter

İlgili konular