2012-04-10 56 views
1

在該程序數據轉換我們使用數據轉換,從一類到類C.當我們使用C++的用戶定義的對象

a(c c1) 
{ 
    return (c1.getd()*100) 
} 
// constructor in class a, this is correct, but when when we use 

c(a a1) 
{ 
    return (a1.getb()/100) 
} 
// constructor, then compile error comming that getb is not a member of a please clear what is the problem. 


#include<iostream.h> 
#include<conio.h> 

    class a; 
    class c { 
     int d; 
     public: 
      c() { 
      d=0; 
      } 
      c(int x) { 
      d=x; 
      } 
      int getd() { 
      return d; 
      } 
      void putdata() { 
      cout<<d; 
      } 
      c(a a1){ 
      d=(a1.getb()/100);//here is compile error coming --getb is not a member of a 
      } 
    }; 
    class a { 
    int b; 
    public: 
     a() { 
    b=0; 
     } 
     a(int x) { 
    b=x; 
     } 
     void putdata() { 
     cout<<b; 
     } 
     int getb() { 
     return b; 
     } 
    }; 

    void main() { 
    c c1; 
    a a1=100; 
    a a2(100); 
    c1=a1; 

    c1.putdata(); 
    getch(); 
    } 
+3

請重新格式化你的代碼,你的問題......這是難以閱讀 – linello 2012-04-10 11:11:53

+0

我認爲這個問題是東陽編譯器沒有辦法知道班組長A已經getb功能...你defne類前C類?或者無論如何宣佈它是... ..? – 2012-04-10 11:23:25

回答

1

a是(正向)聲明,但所遇到函數定義當沒有定義。移動定義的class a後定義:

class a; 

class c { 
    int d; 
public: 
    c() { d=0; } 
    c(int x) { d=x; } 
    int getd() { return d; } 
    void putdata() { cout<<d; } 

    c(a& a1); // Pass a1 as reference as class a is not yet defined. 
    }; 

class a 
{ 
... 
}; 

c::c(a& a1) 
{ 
    d=(a1.getb()/100); 
} 

此外,#include <iostream>而不是#include <iostream.h>

+0

當我們這樣做時,同樣的問題與構造函數a(c c1){retrun c1.getd()* 100在類a中相關聯,即getd不是c的成員 – ajava 2012-04-10 11:24:11

+0

您是否將參數類型從'a'更改爲' A&'?我只是仔細檢查了這一點,它並沒有問題。 – hmjd 2012-04-10 11:27:55

+0

編譯與VS2010和這裏http://ideone.com/2uo09與gcc v4.3.4。 – hmjd 2012-04-10 11:31:01

1

當你寫

class a; 

你是有前途的,你將定義爲「類」在稍後的階段。

然後,您在定義它之前使用了類a。 可以通過編寫定義類a後使用類a的代碼來使代碼工作。

#include<iostream> 
#include<conio.h> 

using namespace std; 

class a; 
class c 
{ 
    int d; 
public: 
    c():d(0)   {} 
    c(int x):d(x) {} 
    int getd()  {return d;} 
    void putdata() {cout<<d;} 
    c(a a1);  // defined after class a is defined 

}; 

class a 
{ int b; 
public: 
    a():b(0)   {} 
    a(int x): b(x) {} 

    void putdata() {cout<<b;} 
    int getb()  {return b;}  
}; 


c::c(a a1) 
{ 
    // uses class a after it is defined 
    d=(a1.getb()/100); 
} 

void main() 
{ 
    c c1; 
    a a1=100; 
    a a2(100); 
    c1=a1; 


    c1.putdata(); 
    getch(); 
} 
+1

Thannkyou先生。它的作品和所有疑問都很清楚。 – ajava 2012-04-10 11:42:35

+0

很高興能有所幫助。如果清除了您的疑問,請繼續並接受答案。 – Ram 2012-04-10 15:25:53

0

編譯器總是從頂部解析文本文件,因此在使用方法或函數之前必須定義它。

您的行class a;告訴編譯器有一個名爲a的類,但此時編譯器不知道任何成員函數。

如果在類c的聲明之前放置下面的代碼,那麼編譯器知道在類a的對象上使用mehod getb並不違法,即使它不知道該方法的作用。

class a 
{ 
    public: 
     int getb(); 
} 
0

我認爲問題在於聲明類的順序。請嘗試以下操作:

#include<iostream.h> 
#include<conio.h> 

class a 
{ 
    int b; 

public: 

    a() 
    { 
    b=0; 
    } 

    a(int x) 
    { 
    b=x; 
    } 

    void putdata() 
    { 
    cout<<b; 
    } 

    int getb() 
    { 
    return b; 
    } 

}; 

class c 
{ 
    int d; 

public: 

    c() 
    { 
    d=0; 
    } 

    c(int x) 
    { 
    d=x; 
    } 

    int getd() 
    { 
    return d; 
    } 

    void putdata() 
    { 
    cout<<d; 
    } 

    c(a a1) 
    { 
    d=(a1.getb()/100);//here is compile error coming --getb is not a member of a 
    } 

}; 

int main() 
{ 
c c1; 
a a1=100; 
a a2(100); 
c1=a1; 


c1.putdata(); 
getch(); 

return 0; 
}