2016-08-23 16 views
-1

私は初めてC++でVS(2015)を使用していますが、途中で適切なコードを作成する初心者です。シンプルな何かをしようとすると - 初期化子リストを使用し...しかし、このエラーを投げています:C++初期化子リストの問題 - エラー:削除された関数を参照しようとしています

私が持っている(User.h):「C2280は、削除機能参照しよう」:場合

class User { 
protected: 
    ICoordinateMapper* _coordMapper; 
public: 
    User(ICoordinateMapper coordinateMapper) 
    : _coordMapper(coordinateMapper){} 
}; 

をI次のようにコンストラクタをオーバーロード、それが正常に動作します:

class User { 
protected: 
    ICoordinateMapper* coordinateMapper; 
public: 
    User(){} 
    User(ICoordinateMapper* coordinateMapper) 
    : _coordMapper(coordinateMapper){} 
}; 

マイアプリは以下のように(openFrameworksて)実行されます。

#include "ofApp.h" 
int main(){ 
    ... 
    ofRunApp(new ofApp()); 
} 

ofApp.h:

#pragma once 
#include "ofMain.h" 
#include "User.h" 
class ofApp : public ofBaseApp{ 
public: 
    ... 
    User user; 
} 

なぜですか?私はイニシャライザリストを使うときにコンストラクタをオーバーロードする必要はないと思った?それとも私ですか?

答えて

2

Userデフォルトコンストラクタを持たない最初の変種では、コンパイラはデフォルトコンストラクタを作成しません。これは、Userクラスのオブジェクトを(ofAppクラスのように)デフォルト設定する方法がないことを意味します。

問題を解決するには2つの方法があります。最初に知っていることは、デフォルトのコンストラクタを作成することです。

class User { 
    ... 
    User(ICoordinateMapper coordinateMapper = nullptr) 
    : _coordMapper(coordinateMapper){} 
    ... 
}; 
:これの変形例として、あなたは、他のソリューションは、他のコンストラクタのデフォルト引数を使用することですので、それはデフォルトコンストラクタのように引数なしで実行することができ

class User { 
    ... 
    User() = default; 
    ... 
}; 

を使用して、コンパイラのデフォルトコンストラクタを使用することができます

_coordMapperメンバーを初期化するため、2番目の方法をお勧めします。

+0

ありがとうございます!デフォルトの引数を使用することは理にかなっています。それが私が欠けていたものです。 – tyhenry

関連する問題