0
//file.h
# define PartExport __declspec(dllexport)
namespace Part{

class PartExport MyClass : public data::anotherClass{
  MyClass();
  void read();
};
}

以下でこれを実行して、この機能にアクセスしたいと思います。Visual Studio では、「Part::read();」を実行することをお勧めします。その機能へのf12が機能します。

//main.cpp
#include <file.h>

int main(){

   Part::read();
   return 0;
}

しかし、コンパイルすると、PartExport がクラス名であると見なされるため、構文エラーが発生します。この関数にアクセスしたり、MyClass のオブジェクトを作成するにはどうすればよいですか?

編集:クラスのすべての構文エラーは #include に起因することに気付きました。それが何を意味するのかわからない

4

2 に答える 2

2

クラスMyClassがエクスポートされるため、 main に次のように記述する必要があります。

Part::MyClass myClass;
myClass.read();

メインで実際に行うように関数を呼び出したい場合は、次のように記述する必要がありますfile.h

namespace Part{

  void PartExport read();

}

ただし、この場合、クラスのカプセル化が失われます。


別のこと:DLLを作成する__declspec(dllexport)には、ライブラリに関数をエクスポートするように指定する必要があります。

ただし、この関数を使用している場合、この関数は既にライブラリにエクスポートされているため、この関数をエクスポートすることを実行可能ファイルに指示しないでください。

プロジェクトでこのマクロを定義する dll をコンパイルすることをお勧めします。PART_EXPORT_DLL

次に、次のように記述しますfile.h

//file.h
#ifdef PART_EXPORT_DLL
#    define PartExport __declspec(dllexport)
#else
#    define PartExport __declspec(dllimport)
#endif
namespace Part{

    class PartExport MyClass : public data::anotherClass{
      MyClass();
      void read();
    };
}

そして、それをインポートしたいときは、定義しないでくださいPART_EXPORT_DLL

于 2015-11-12T09:39:40.297 に答える
1

アクセスしたいのは関数ではなく、メンバー関数です。そのため、メンバーであるクラスを指定する必要があります。

また、関数に似た static として宣言していないため、アクセスする前に MyClass の 1 つをインスタンス化する必要さえあります。(非静的関数には「this」ポインターがあり、クラスのインスタンスがなければ「this」はありません)

名前空間「Part」は、クラスの別のラッパーです。

名前空間内の何かにアクセスするには、次のようにします。

Part::somethinginmynamespace

名前空間で関数を呼び出すには

Part::somefunction();

使用する静的メンバー関数にアクセスするには

Part::SomeClass::SomeStaticFunction();

非静的メンバー関数にアクセスするには、次のようにします。

Part::Someclass myinstance;
myInstance.myFunction();

定義でエラーが発生し、コンパイラがそれをクラス名であると判断した場合、その定義は未定義です。コメントに入れたか、大文字/小文字が間違っている可能性があります。

于 2015-11-12T09:45:15.157 に答える