2012-10-27 42 views
5

Code:Làm cách nào để khai báo và triển khai hàm const và inline?

point3f.h

Class Point3f { 
    ... 
    inline void project2D(ProjType p, const Point2i& view) const; 
}; 

point3f.cpp

inline void Point3f::project2D(ProjType p, const Point2i& view) const { 
    switch(p) { 
     case PROJ_XY: 
      glVertex2f(x * view.x, y * view.y); 
      break; 
     case PROJ_YZ: 
      glVertex2f(y * view.x, z * view.y); 
      break; 
     case PROJ_XZ: 
      glVertex2f(x * view.x, z * view.y); 
      break; 
     default: 
      break; 
    } 
} 

gọi hàm này đặt ra một lỗi trong thời gian biên dịch:

undefined reference to `Point3f::project2D(ProjType, Point2i const&) const' 

Tôi đã thử mọi trường hợp mà không cần và với inline biểu tượng:

inline trong phần đầu, không phải trong cpp:

Warning: inline function ‘void Point3f::project2D(ProjType, const Point2i&) const’ used but never defined [enabled by default 
undefined reference to `Point3f::project2D(ProjType, Point2i const&) const'| 

inline trong phần đầu, cũng trong cpp:

Warning: inline function ‘void Point3f::project2D(ProjType, const Point2i&) const’ used but never defined [enabled by default 
undefined reference to `Point3f::project2D(ProjType, Point2i const&) const'| 

inline không trong phần đầu, nhưng trong cpp:

undefined reference to `Point3f::project2D(ProjType, Point2i const&) const'| 

inline không có trong tiêu đề, không phải trong cpp:

It works but that's not what I want 

Câu hỏi:

  1. Liệu const and inline member function có ý nghĩa?
  2. Làm cách nào để khai báo const and inline member function?

Xin cảm ơn trước.

Trả lời

5

Chức năng đang là const không liên quan gì đến nó. Nếu bạn muốn nó inline, bạn phải xác định nó trong tệp tiêu đề thay vì trong point3f.cpp. Ví dụ:

class Point3f { 
    ... 
    inline void project2D(ProjType p, const Point2i& view) const 
    { 
     switch(p) { 
     case PROJ_XY: 
      glVertex2f(x * view.x, y * view.y); 
      break; 
     case PROJ_YZ: 
      glVertex2f(y * view.x, z * view.y); 
      break; 
     case PROJ_XZ: 
      glVertex2f(x * view.x, z * view.y); 
      break; 
     default: 
      break; 
     } 
    } 
}; 

Trong trường hợp này, từ khóa inline là không cần thiết chút nào. Nếu bạn xác định hàm bên trong định nghĩa lớp, thì inline là mặc định. Nhưng bạn vẫn có thể chỉ định nó, nếu bạn muốn (như tôi đã làm trong ví dụ trên.)

+0

Để làm rõ, sự cố không có trong sự trộn lẫn của 'const' và' inline' (tôi làm tất cả thời gian), nhưng trong thực tế là 'inline' phải nằm trong tệp tiêu đề. –

+0

Theo những gì bạn đã nói, g ++ chỉ tăng thêm một cảnh báo rằng 'warning: inline function 'void Point3f :: project2D (ProjType, const Point2i &) const' được sử dụng nhưng không bao giờ được định nghĩa [được bật theo mặc định]' –

+0

@ComboZhc Không đặt chức năng trong tệp .cpp. Đặt nó * chỉ * trong tiêu đề. –

0

Bạn tuyên bố nó là nội tuyến trong tệp cpp, do đó không có biểu tượng nào được phát ra, trong point3f.cpp nó luôn luôn được gạch chân. Nhưng các tệp khác bao gồm tiêu đề, không có cách nào để nội tuyến hóa chức năng, chúng cần biểu tượng này được phát ra. Tôi đoán đó là trường hợp ở đây.

1

Im teste này và hoạt động tốt! ví dụ này có thể được viewd tại địa chỉ: http://www.doc.ic.ac.uk/lab/cplus/c++.rules/chap7.html

Ví dụ 24: Quá tải một nhà điều hành/chức năng liên quan đến const-Ness

#include <iostream.h> 
    #include <string.h> 
    static unsigned const cSize = 1024; 
    class InternalData {}; 

    class Buffer 
    { 
     public: 
     Buffer(char* cp); 

     // Inline functions in this class are written compactly so the example 
     // may fit on one page. THIS is NOT to be done in practice (See Rule 21). 

     // A. non-const member functions: result is an lvalue 
     char& operator[](unsigned index) { return buffer[index]; } 
     InternalData& get() { return data; } 

     // B. const member functions: result is not an lvalue 
     char operator[](unsigned index) const { return buffer[index]; } 
     const InternalData& get() const { return data; } 

     private: 
     char buffer[cSize]; 
     InternalData data; 
    }; 

    inline Buffer::Buffer(char* cp) 
    { 
     strncpy(buffer , cp , sizeof(buffer)); 
    } 

    main() 
    { 
     const Buffer cfoo = "peter";// This is a constant buffer 
     Buffer foo = "mary";// This buffer can change 

     foo[2]='c';// calls char& Buffer::operator[](unsigned) 
     cfoo[2] = 'c' // ERROR: cfoo[2] is not an lvalue. 

     // cfoo[2] means that Buffer::operator[](unsigned) const is called. 

     cout << cfoo[2] << ":" << foo[2] << endl; // OK! Only rvalues are needed 

     foo.get() = cfoo.get(); 
     cfoo.get() = foo.get(); // ERROR: cfoo.get() is not an lvalue 
    } 

hy vọng với sự giúp đỡ!

hòa bình và ánh sáng!

Các vấn đề liên quan