2012-04-16 11 views
0

私はいくつかの未定義クラスの問題を抱えていたので、1つのヘッダーがそれ自体を追加していた別のものを追加していたので、その時点で存在するので、私はこれを作ったし、初めに入れ、コンパイルが正常に行きましたが、コンパイルの非常に最後の1秒にそれがVisual C++/Cliで "クラス未定義"を避けるためにクラスを事前定義するにはエラーLNK2020

Error 230 error LNK2020: unresolved token (0600003C) Servicos::.ctor Servicos.obj 

エラーを投げた - Iので

public ref class Servicos: public System::Windows::Forms::Form { 
    public: 
    Servicos(Usuario*,unordered_map<int, std::string>*); 
} 

他の機能のその瞬間を気にしていなかった、私はちょうどこれは、クラスをインスタンス化してダイアログを表示するだけなので、nstructorを使用します。これはオリジナルです

(私もすべての機能を追加しようとしたんでした、と同じエラーが起こったaltho):

namespace MyProject { 
public ref class Servicos: public System::Windows::Forms::Form 
    { 

    //... Some Variables declared 

    public: 
     Servicos(Usuario* user, 
      unordered_map<int, std::string>* fab_contas_) 
     { 
      this->fab_contas_email = fab_contas_; 
      this->usuario = user; 
      InitializeComponent(); 
      // 
      //TODO: Add the constructor code here 
      // 
     } 

//... And Other Functions 
}; 

} 

は、私が何か間違ったことをやっているすべてのあなたのみんなポイントをできますか?どうもありがとうございました! ありがとう!

答えて

1

これはあまり意味がありません。リンカーは、Servicosクラスのコンストラクタが定義されていないことを教えています。コンパイルがリンクフェーズに達したということは、ctorが(明示的または暗黙的に)宣言されたことを意味します。

パブリックリファレンスクラスServicos:パブリックシステム:: Windows ::フォーム::フォーム{ public: ServicosFacebook(Usuario *、unordered_map *); }

これはおそらく問題を引き起こしていますが、構文エラーがありますので、実際に使用しているものであってはいけません(そうでなければ、リンクフェーズにはいきません)。関数ServicosFacebookはctorではなく、戻り値の型もありません。

は、私はあなたがこの代わりに持っていると仮定します。これは、タイプServicosの(二つのパラメータを持つ)コンストラクタがあることをコンパイラに通知

public ref class Servicos: public System::Windows::Forms::Form { 
    public: 
    Servicos(Usuario*,unordered_map<int, std::string>*); 
} 

が、それは別の場所で定義されている - ここでこの権利はですあなたが実際に定義を提供していないので、リンカのエラーにつながる問題です。

ただし、コンストラクタを定義するクラスの定義は、MyProject名前空間に存在するため、完全に異なる型です。

上記のクラス宣言をMyProject名前空間に入れるだけでは、1つの定義ルールに違反するので十分ではありません。クラスの定義は1つしかできませんが、2つ(同じであっても)です。

修正するには、ヘッダーファイルの循環依存関係を解決する必要があります。あなたは十分な情報を提供していないので、私はそこであなたをあまり助けることはできません。あなただけのクラスが存在するという概念が必要な場合は、循環依存関係を壊すために、ヘッダーに宣言を前方に使用することができます

class Servicos; 

これは、あなたがそのクラスへのポインタを宣言することができますが(メンバ変数や関数のパラメータなど) 。あなたは適切なServicosヘッダーをに含める必要があります。(ないそのヘッダー内)のcppファイル

UPDATE:

試してみてください。私はそこにミスを犯しても、それは "Servicos" ではなく "ServicosFacebook" になるはずだった、答えるため

// Servicos.h 
// include headers that contain the definition of Windows Forms, Usuario, 
// unordered_map, string, etc. 
using namespace std; 
namespace MyProject { 
    public ref class Servicos: public System::Windows::Forms::Form 
    { 

    //... Some Variables declared 

    public: 
    Servicos(Usuario* user, 
     unordered_map<int, std::string>* fab_contas_); 

    //... And Other Functions 
    }; 

} 

// Servicos.cpp 
#include "Servicos.h" 
using namespace MyProject; 

Servicos::Servicos(Usuario* user, 
     unordered_map<int, std::string>* fab_contas_) 
{ 
    this->fab_contas_email = fab_contas_; 
    this->usuario = user; 
    InitializeComponent(); 
    // 
    //TODO: Add the constructor code here 
    // 
} 

//... And Other Functions 

// ServicosUser.h 
#include "Servicos.h" 

// ... declarations that use Servicos 

// ServicosUser.cpp 
#include "ServicosUser.h" 

// ... definitions of things declared in ServicosUser.h 
+0

感謝私はすでに変更されていますが、それは再定義ではありません。クラスはインスタンス化の後で宣言されているので、コンパイラがそれを知るように設定する必要があります。私はCPPではないifndef文の直後にヘッダを定義し、CPPは使用せず、ヘッダファイルに直接インクルードするだけです。クラスを作成する前にDialogを表示するようにインスタンス化するので、コンストラクタを定義する必要があります。どうすればいい? – Grego

+0

循環参照を適切に回避するには、.cppを使用する必要があります。 'Servicos :: Servicos(Usuario * u、unordered_map * map){...}' – Attila

+0

コンストラクタを定義する前にあなたに示したようにコンテンツなしで、テンプレートのように、しかし、私はあなたのように定義した場合、それはすでにクラスが存在するクラスをスローするつもりはないのですか?あなたはあなたの質問を編集し、どうすればいいのか教えてください。私は何週間もこれをやろうとしてきましたが、私はできません:/あなたに感謝! – Grego

関連する問題