2012-10-27 8 views
5

कोड:एक कॉन्स्ट और इनलाइन सदस्य फ़ंक्शन घोषित और कार्यान्वित कैसे करें?

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

इस कार्यप्रणाली को कॉल संकलन समय में किसी त्रुटि को जन्म देती है:

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

मैं बिना हर मामले की कोशिश की और inline प्रतीक के साथ:

inline शीर्षक में, सीपीपी में नहीं:

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, यह भी सीपीपी में:

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 नहीं शीर्षक में है, लेकिन सीपीपी में:

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

inline शीर्षलेख में नहीं, न तो सीपीपी में:

It works but that's not what I want 

प्रश्न:

  1. करता const and inline member function मेकअप भावना?
  2. const and inline member function घोषित कैसे करें?

अग्रिम धन्यवाद।

उत्तर

5

फ़ंक्शन const के साथ इसका कोई लेना-देना नहीं है। यदि आप इसे inline चाहते हैं, तो आपको इसे point3f.cpp के बजाय हेडर फ़ाइल में परिभाषित करना होगा। उदाहरण:

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

इस मामले में, inline कीवर्ड बिल्कुल जरूरत नहीं है। यदि आप कक्षा परिभाषा के अंदर फ़ंक्शन को परिभाषित करते हैं, तो inline डिफ़ॉल्ट है। लेकिन यदि आप चाहते हैं (जैसा कि मैंने उपर्युक्त उदाहरण में किया है।)

+0

स्पष्टीकरण के लिए, समस्या 'const' और' inline' (मैं इसे हर समय करता हूं) के मिश्रण में नहीं है, लेकिन इस तथ्य में कि 'इनलाइन' हेडर फ़ाइल में होना चाहिए। –

+0

आपने जो कहा है उसके बाद, जी ++ सिर्फ एक और चेतावनी उठाता है कि 'चेतावनी: इनलाइन फ़ंक्शन' शून्य पॉइंट 3 एफ :: प्रोजेक्ट 2 डी (प्रोजेटाइप, कॉन्स प्वाइंट 2i और) कॉन्स्ट 'का उपयोग किया जाता है लेकिन कभी परिभाषित नहीं किया गया है [डिफ़ॉल्ट रूप से सक्षम] ' –

+0

@ComboZhc नहीं डालें बिल्कुल .cpp फ़ाइल में फ़ंक्शन। हेडर में * केवल * रखो। –

0

आपने इसे सीपीपी फ़ाइल में इनलाइन के रूप में घोषित किया है, इस प्रकार कोई प्रतीक उत्सर्जित नहीं होता है, point3f.cpp में यह हमेशा रेखांकित होता है। लेकिन हेडर को शामिल करने वाली अन्य फाइलों में फ़ंक्शन को रेखांकित करने का कोई तरीका नहीं है, उन्हें इस प्रतीक को उत्सर्जित करने की आवश्यकता है। मुझे लगता है कि यह मामला यहां है।

1

मैं इसका परीक्षण करता हूं और ठीक काम करता हूं! http://www.doc.ic.ac.uk/lab/cplus/c++.rules/chap7.html

उदाहरण 24: इस उदाहरण को viewd जा सकती है स्थिरांक सत्ता के संबंध में एक ऑपरेटर/समारोह ओवरलोडिंग

#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 
    } 

मदद से आशा!

शांति और प्रकाश!

संबंधित मुद्दे