Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: Cách truy xuất đối tượng trong lập trình C

  1. #1
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Cách truy xuất đối tượng trong lập trình C

    Mình có bài này :
    PHP Code:
    #include <iostream>
    #include <cstdlib>
    #include <new>
    #include <iomanip>
    #define MAX 1000
    class Square
    {
          public :
            
                
    Square(); /*Constructor*/
               
    ~Square(); /*Destructor*/
                
    SquareSquare &); /*Copy constructor*/
                
    void Display(intint);
                
    void Output_Data();
                
    void Initialization();
                
    void Dynamic_Programmingint**, int**, int**);
                
    void Cut_Process(intint);
               
          private :
                
    int **Rectangle;
                
    int **Dx, **Dy;

                
    int lengthwidth;
                
    int _cP/*cutting point*/
    };

    Square::Square() 
    {
          
    cout << "Enter the Length and Width : ";
          
    cin >> length >> width;

          
    Rectangle = new int *[length+1];
          
    Dy = new int *[length+1];
          
    Dx = new int *[length+1];
          
          for( 
    int x 0<= lengthx++){
                
    Rectangle[x] = new int[width+1];
                
    Dx[x] = new int[width+1];
                
    Dy[x] = new int[width+1];
          }
          
    Display (length+1width+1);
          
    Initialization();
          
    Dynamic_Programming RectangleDxDy);
          
    Output_Data();
    }

    /*Destructor*/
    Square::~Square()
    {
          for( 
    int x 0<= lengthx++){
                
    delete[] Rectangle[x];
                
    delete[] Dx[x];
                
    delete[] Dy[x];
                
          }
          
    delete[] Rectangle;
          
    delete[] Dx;
          
    delete[] Dy;
    }

    void Square::Dynamic_Programmingint **Rectangleint **Dxint **Dy)
    {
          
    /*Matrix solution*/
          
    int xPos,
              
    yPos;

          
    xPos 1;
          do
          {
                
    yPos 1;
                do
                {
                      
    /*Hyposthesis Dynamic Programming*/
                      
    if ( xPos == yPos )
                      {
                            
    Rectangle[xPos][yPos] = 1;
                      }
                      else
                      {
                            
    Rectangle[xPos][yPos] = MAX;
                            
                            for ( 
    _cP 1_cP <= xPos-1_cP++ )
                            {
                                  if ( 
    Rectangle[xPos][yPos] > Rectangle[_cP][yPos] + Rectangle[xPos-_cP][yPos] )
                                  {
                                        
    Rectangle[xPos][yPos] = Rectangle[_cP][yPos] + Rectangle[xPos-_cP][yPos];
                                        
    Dx[xPos][yPos] = _cP;
                                        
    Dy[xPos][yPos] = 0;
                                  }
                            }
                            for ( 
    _cP 1_cP <= yPos-1_cP++ )
                            {
                                  if (  
    Rectangle[xPos][yPos] > Rectangle[xPos][_cP] + Rectangle[xPos][yPos-_cP] )
                                  {
                                        
    Rectangle[xPos][yPos] = Rectangle[xPos][_cP] + Rectangle[xPos][yPos-_cP];
                                        
    Dy[xPos][yPos] = _cP;
                                        
    Dx[xPos][yPos] = 0;
                                  }
                            }
                      }
                      
    yPos++;
                }
                while ( 
    yPos <= width);
                
                
    xPos++;
          }
          while ( 
    xPos <= length );
    }
    void Square::Displayint xRowint yCol)
    {
          for( 
    int i 0<= xRowi++){
                for (
    int x 1<= yCol*5x++ ){
                      
    cout << '-';
                }
                
    cout << "\n";
               
                for( 
    int j 1<= yColj++){
                      
    cout << "|";
                      
    cout.width(5);
                }
                
    cout << "|";
                
    cout << "\n";
          }
          for ( 
    int x 1yCol*+1x++ ){
                      
    cout << '-';
          }
          
    cout << "\n\n";
    }
    /*Constructor*/

    void Square::Initialization()      
    {
          for( 
    int x 0<= lengthx++)
          {
                for ( 
    int y 0<= widthy++ )
                {
                      
    Rectangle[x][y] = 0;
                      
    Dx[x][y] = 0;
                      
    Dy[x][y] = 0;
                }
          }
    }

    void Square::Cut_Process(int xPosint yPos)
    {
          if ( 
    xPos == yPos )
          {
                
    cout << xPos << " x " << yPos;
                
    cout << "\n\n";
                
    Display (xPosyPos);
                
    cout << endl;
          }
          else
          {
                if ( 
    Dx[xPos][yPos] != )
                {
                      
    Cut_Process(Dx[xPos][yPos], yPos);
                      
    Cut_Process(xPos Dx[xPos][yPos], yPos);
                }
          
                else
                {
                      
    Cut_Process(xPosDy[xPos][yPos]);
                      
    Cut_Process(xPosyPos Dy[xPos][yPos]);
                }
          }
    }
    void Square::Output_Data()
    {
          
    cout << "Minimum square : " << Rectangle[length][width];
          
    cout << "\n\n\n";
          
    Cut_Processlengthwidth);
    }

    int main(void)
    {
          
    Square Object;
          return 
    0;

    Nếu mình đặt cái lời gọi hàm vào constructor như trên :
    Code:
    Square::Square() 
    {
          cout << "Enter the Length and Width : ";
          cin >> length >> width;
    
          Rectangle = new int *[length+1];
          Dy = new int *[length+1];
          Dx = new int *[length+1];
          
          for( int x = 0; x <= length; x++){
                Rectangle[x] = new int[width+1];
                Dx[x] = new int[width+1];
                Dy[x] = new int[width+1];
          }
          Display (length+1, width+1);
          Initialization();
          Dynamic_Programming ( Rectangle, Dx, Dy);
          Output_Data();
    }
    thì được nhưng cho mình hỏi nếu mình muốn tạo 1 đối tượng và dùng đối tượng này để gọi tới các hàm thành phần trong main thì mình phải làm sao ? Có phải mình cần dùng copy constructor không ?
    Ví dụ nếu mình gọi hàm như sau :
    Code:
    Square Obj;
    Obj.Dynamic_Programming ( Rectangle, Dx, Dy );
    thì nó không cho phép ? Mình phải làm sao để có thể gọi các hàm thành phần khi thành phần dữ liệu của nó có con trỏ và dữ liệu đc cấp phát trên Heap.
    Các bạn giúp mình nhé ! Thanks !

  2. #2
    Ngày gia nhập
    09 2007
    Bài viết
    724

    mình thêm vào Class của bạn một Construction để set 2 giá trị của lenght và width cho thằng Object nào mà gọi nó.
    Code:
    Square::Square(int l,// l tương đương với length của bạn
                          int w // w tương đương với with của bạn.
                          )
    {
    	length = l;
    	width = w;
    	Rectangle = new int *[length+1];
        Dy = new int *[length+1];
        Dx = new int *[length+1];
          
        for( int x = 0; x <= length; x++)
    	{
    		Rectangle[x] = new int[width+1];
    		Dx[x] = new int[width+1];
    		Dy[x] = new int[width+1];
          }
    	  
    }
    mình thêm bên trong class của bạn một phương thức nữa là:

    Code:
    void Square::Dynamic_Programming()
    {
    	int xPos,
              yPos;
    
          xPos = 1;
          do
          {
                yPos = 1;
                do
                {
                      /*Hyposthesis Dynamic Programming*/
                      if ( xPos == yPos )
                      {
                            Rectangle[xPos][yPos] = 1;
                      }
                      else
                      {
                            Rectangle[xPos][yPos] = MAX;
                            
                            for ( _cP = 1; _cP <= xPos-1; _cP++ )
                            {
                                  if ( Rectangle[xPos][yPos] > Rectangle[_cP][yPos] + Rectangle[xPos-_cP][yPos] )
                                  {
                                        Rectangle[xPos][yPos] = Rectangle[_cP][yPos] + Rectangle[xPos-_cP][yPos];
                                        Dx[xPos][yPos] = _cP;
                                        Dy[xPos][yPos] = 0;
                                  }
                            }
                            for ( _cP = 1; _cP <= yPos-1; _cP++ )
                            {
                                  if (  Rectangle[xPos][yPos] > Rectangle[xPos][_cP] + Rectangle[xPos][yPos-_cP] )
                                  {
                                        Rectangle[xPos][yPos] = Rectangle[xPos][_cP] + Rectangle[xPos][yPos-_cP];
                                        Dy[xPos][yPos] = _cP;
                                        Dx[xPos][yPos] = 0;
                                  }
                            }
                      }
                      yPos++;
                }
                while ( yPos <= width);
                
                xPos++;
          }
          while ( xPos <= length );
    }
    và đây là hàm main của mình:

    Code:
    void main()
    {
    	int l, w;
    	cout << "Enter the Length and Width : ";
        cin >> l >> w;
    	
    	Square *t;
    	t = new Square(l,w);
    
    	t->Display (l+1, w+1);
    	t->Initialization();
    	t->Dynamic_Programming();
    	t->Output_Data();
    }

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Cám ơn zkday2686 nhiều nhé! Sao mỗi lần viết có class là rối tung cả lên :( ! Nhìn cái code mà tối tăm không chịu được, hic ! Nhân tiện bạn có cách nào viết cho nó sáng sủa hơn không, ý mình là do mình thấy Width và Length có thuộc tính private nên mình sẽ phải tạo thêm 1 copy constructor phải không ?
    Code:
    Square *t;
    	t = new Square(l,w);
    Chỗ này cho mình hỏi là mình bắt buộc phải tạo 1 đối tượng con trỏ phải không do dữ liệu của mình đc cấp phát trên heap, nên chỉ có như thế mới truy xuất được dữ liệu đó.
    Srry nếu mình hỏi có ngỡ ngẩn quá nhé !

  4. #4
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Cấp stack cũng được mà heap cũng được, chả sao cả. Class của bạn không có data member static nên cấp trên stack không thành vấn đề.
    Code trên thiếu operator=

  5. #5
    Ngày gia nhập
    09 2007
    Bài viết
    724

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    Cám ơn zkday2686 nhiều nhé! Sao mỗi lần viết có class là rối tung cả lên :( ! Nhìn cái code mà tối tăm không chịu được, hic ! Nhân tiện bạn có cách nào viết cho nó sáng sủa hơn không, ý mình là do mình thấy Width và Length có thuộc tính private nên mình sẽ phải tạo thêm 1 copy constructor phải không ?
    ok. đúng như bạn nói. nhưng mà nó chỉ là một cách mà cách này người ta chỉ dùng khi thật cần thiết. còn nếu muốn class của bạn sáng hơn một xíu thì bạn có thể thêm các phương thức set [cái này không nhớ tên gọi là gì nên mình gọi tạm là set] cho các biến;
    tức là thế này:
    Code:
    class A
    {
     private:
             int B;
             char *C;
     public:
             A();
             ~A();
             void SetB(int newB);
             void SetC(char *c);
             int GetB();
             char* GetC();
    }
    trong file CPP thì bạn viết 2 phương thức
    Code:
         void A::SetB(int newB){
                  this->B = newB;
          }
          void A::SetC(char *c){
                  this->C = c;
           }
          int A::GetB()
          {
               return this->B;
          }
          char* A::GetC()
          {
               return this->C;
          }
    Code:
    Square *t;
    	t = new Square(l,w);
    Chỗ này cho mình hỏi là mình bắt buộc phải tạo 1 đối tượng con trỏ phải không do dữ liệu của mình đc cấp phát trên heap, nên chỉ có như thế mới truy xuất được dữ liệu đó.
    Srry nếu mình hỏi có ngỡ ngẩn quá nhé !
    cái này bạn có thể khai báo không cần con trỏ cũng được không sao cả. bạn có thể dùng hoặc không dùng con trỏ ở đây nhưng theo mình thì nên dùng vì khi dùng thì khi người khác đọc chương trình của mình thì dễ đọc hơn, chưa kể khi mà bạn dùng kế thừa(Đa Xạ) trong OOP thì đối với C++ bạn phải dùng con trỏ thì nó mới thực hiện đúng được.
    Đã được chỉnh sửa lần cuối bởi zkday2686 : 20-11-2007 lúc 11:07 PM.

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Cách truy xuất đối tượng trong lập trình C

    Cấp stack cũng được mà heap cũng được, chả sao cả. Class của bạn không có data member static nên cấp trên stack không thành vấn đề.
    Code trên thiếu operator=
    Thanks anh nhé ! Anh nói thiếu operator =, điều này có nghĩa là gì anh nhỉ ? Vậy khi nào em dùng có static member, nếu muốn truy xuất đến nó thì em chỉ có cách dùng con trỏ ? Em có thể hiểu vậy dc không ?
    ok. đúng như bạn nói. nhưng mà nó chỉ là một cách mà cách này người ta chỉ dùng khi thật cần thiết. còn nếu muốn class của bạn sáng hơn một xíu thì bạn có thể thêm các phương thức set [cái này không nhớ tên gọi là gì nên mình gọi tạm là set] cho các biến.
    Mình cũng có đọc sách tháy nó nói vì set và get Function. Mình hiểu ý bạn rồi. Để mình sữa lại xem coi có đúng mình hiểu không, mình sẽ post lên sau.Cám ơn bạn nhiều nhé.

  7. #7
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Thanks anh nhé ! Anh nói thiếu operator =, điều này có nghĩa là gì anh nhỉ ?
    Khi làm việc với con trỏ, code theo class, bắt buộc phải implement các method sau (nguyên nhân thì chắc rok_rook hiểu ):

    + Copy constructor
    + Operator =
    + Destructor

    Mình cũng có đọc sách tháy nó nói vì set và get Function.
    Bản chất của get và set (trong .net gọi là properties) là cung cấp độ flexible cho đối tượng.

    Câu hỏi : Tại sao không khai báo member là public luôn mà lại tốn thêm get và set để làm gì ?
    Keep moving forward!

    ... Retired ...

  8. #8
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Câu hỏi : Tại sao không khai báo member là public luôn mà lại tốn thêm get và set để làm gì ?
    Cái này mình nghĩ để làm cho code nó sáng sủa hơn phải không nhc1987 ?
    Khi làm việc với con trỏ, code theo class, bắt buộc phải implement các method sau (nguyên nhân thì chắc rok_rook hiểu ):

    + Copy constructor
    + Operator =
    + Destructor
    Cái này thực sự mình không biết thật, chắc có lẽ đọc ẩu tả hichic. Nhưng mà thôi để mình đoán thử. Vì dùng con trỏ nên việc mình định nghĩa lại operator "=" để tiện cho việc gán đối tượng phải không nhỉ ?
    Copy constructor thì mình nghĩ nếu có 2 đối tượng thì việc này sẽ dẫn đến 2 đối tượng cùng trỏ đến 1 vùng nhớ ( do nó có con trỏ ) nên mình tạo 1 copy constructor để tạo ra bản sao của chính nó.
    Nếu mình sai thì nhc1987 sủa dùm nhé. Cám ơn nch1987 trước nhé ^^! Chắc mình còn phải làm phiền bạn dài dài rồi đó nhé, hì hì ~~

  9. #9
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Khi làm việc với con trỏ, code theo class, bắt buộc phải implement các method sau (nguyên nhân thì chắc rok_rook hiểu ):

    + Copy constructor
    + Operator =
    + Destructor
    Tất cả đều có liên quan đến con trỏ :
    + Copy constructor & operator = : tránh việc trỏ chung vùng nhớ
    + Destructor : giải phóng vùng nhớ

    Câu hỏi : Tại sao không khai báo member là public luôn mà lại tốn thêm get và set để làm gì ?
    Cái này mình nghĩ để làm cho code nó sáng sủa hơn phải không nhc1987 ?
    Oạch, hết hồn : )). Sai rồi

    P/s: hic, buồn ngủ quá (:|
    Đã được chỉnh sửa lần cuối bởi nhc1987 : 21-11-2007 lúc 02:05 AM.
    Keep moving forward!

    ... Retired ...

  10. #10
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Ờ, để mình suy nghĩ lại xem. Đang ở trên trường, thôi có gì để mình về đọc sách lại rồi trả lời bạn sau nhé ^^!

Các đề tài tương tự

  1. Trả lời: 1
    Bài viết cuối: 20-06-2012, 04:39 PM
  2. [C++]truy xuất dữ liệu trong C++
    Gửi bởi takiemtam trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 10
    Bài viết cuối: 17-02-2012, 06:28 PM
  3. Tạo và truy xuất file xml trong C#?
    Gửi bởi rogerminh2401 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 07-04-2011, 08:19 AM
  4. truy xuất tập tin trong C bác nào chỉ em với
    Gửi bởi txpro trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 22-10-2009, 10:18 PM
  5. bác nào rành truy xuất tập tin trong C, chỉ em với
    Gửi bởi stormswt trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 06-01-2008, 12:23 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn