2017-11-20 11 views
1

ここで少し失われます。 CLuaTick :: Initialize()関数で使用するクラス "CLuaTick"に "CLuaHook"タイプのメンバーがあります。リンカのために、私はcppファイルでメンバーを宣言しなければなりませんが、imは完全になぜそうはわかりません。 cpp内のメンバー宣言をnullptrに設定すると、ランタイム・クラッシュ(アクセス違反)が発生します(アクセス違反はまだどこでも使用されていません)。C2512エラー - クラスを初期化していない場合でも

CLuaHookの唯一のコンストラクタはCLuaHook(const char * Hook);です。

EDIT:CLuaHook()は、それが内部リストに登録され、その後削除されなければならないだろうと有効な引数で呼び出されるを持っています。

HERESにコード:
luatick.h

#pragma once 
#include "LuaSrc\lua.h" 
#include "LuaHook.h" 

class CLuaTick 
{ 
private: 
    static CLuaHook m_Hook; 

public: 
    static void Initialize(lua_State *State); 
}; 

luatick.cpp

#include "LuaTick.h" 

CLuaHook CLuaTick::m_Hook; 

void CLuaTick::Initialize(lua_State * State) 
{ 
    m_Hook = CLuaHook("Tick"); 
} 

エラーイム受信:

Error C2512 'CLuaHook': no appropriate default constructor luatick.cpp 
+0

'CLuaHook'は持っていませんあなたはデフォルトのコンストラクタを提供するために、いずれかの必要がある

'CLuaHook CLuaTick :: m_Hook;'は動作しません。 'CLuaHook CLuaTick :: m_Hook = CLuaHook(nullptr);'のように引数を渡す必要があります。 – songyuanyao

+0

リンカを落ち着かせるために実際にその行を追加しました。私はそのメンバーを一度使って、Initializeが呼ばれているときにそれを割り当てたいのですが、どのように達成できますか? – Flowx

+1

['std :: optional'](http://en.cppreference.com/w/cpp/utility/optional)または[' std :: unique_ptr'](http://en.cppreference。 com/w/cpp/memory/unique_ptr)、つまり 'std :: optional 'または 'std :: unique_ptr 'をラップします。 – songyuanyao

答えて

1

コンパイラが説明しているように、このエラーは大変です。クラスCLuaHookのデフォルトコンストラクタはありません。つまり、コンパイラは引数なしでCLuaHookを構築する方法を知らないため、CLuaTickを構築することはできません。

CLuaHook() { ... set string to default value here ... } 

それともあなたがあなたのcppでそれを初期化する場合、デフォルトの文字列を提供する必要があります:

CLuaHook CLuaTick::m_Hook("Default Text"); 
+0

これは実際にオブジェクトを生成しますか?コンストラクタは実際に呼び出されていますか?私はそれに適切な値を割り当てるときに私はそれを上書きすることができます:: Initialize()? – Flowx

+1

@Flowxはいコンストラクタが呼び出されていて、オブジェクトが作成されています。また、このオブジェクトのプロパティを変更するには、インターフェイス関数を用意するか、後で別のオブジェクトに変数を再割り当てします。 CLuaHookのコンテンツに応じて、コピーコンストラクタを用意する必要があります。 –

+0

私は、initialize()が呼び出されるまでm_Hookに触れたくないのですが、何らかの理由でリンカーエラーが発生します。これは可能ですか? – Flowx

関連する問題