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記号の有無にかかわらず、すべてのケースを試しました。

inlinecppではなくヘッダーに:

 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ヘッダー、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ヘッダーではなく、cppで:

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

inlineヘッダーにもcppにもありません:

 It works but that's not what I want

質問:

  1. const and inline member function意味がありますか?
  2. 宣言する方法はconst and inline member function

前もって感謝します。

4

3 に答える 3

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は、がデフォルトです。ただし、必要に応じて指定することもできます(上記の例で行ったように)。

于 2012-10-27T21:19:30.373 に答える
1

私はこれをテストし、正常に動作します! この例は、http://www.doc.ic.ac.uk/lab/cplus/c++.rules/chap7.html で見ることができます

例 24: 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
   }

助けを求めて!

平和と光!

于 2012-10-27T21:39:17.457 に答える
0

cppファイルでインラインとして宣言したため、シンボルは出力されません。point3f.cppでは常にインラインになっています。ただし、ヘッダーを含む他のファイルには、関数をインライン化する方法がないため、このシンボルを出力する必要があります。ここではそうだと思います。

于 2012-10-27T21:22:24.877 に答える