2016-08-23 79 views
-1

我第一次在C++中使用VS(2015),並且是創建半途體面代碼的新手。試圖做一些簡單 - 使用初始化列表...但它拋出這個錯誤:「C2280:試圖引用刪除功能」C++初始化程序列表問題 - 錯誤:嘗試引用已刪除的函數

我有(User.h):

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

如果我重載構造函數如下,它運行良好:

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默認構造函數,編譯器將不會爲您創建默認構造函數。這意味着無法默認構建(類似於ofApp類中的類)User類的對象。

有兩種解決問題的方法:第一種是你已經知道的,那就是創建一個默認構造函數。由於這種變形,你可以通過使用

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

使用編譯器默認的構造函數的其他解決方案是使用默認參數爲其他構造,所以可以不喜歡默認的構造函數參數調用:

class User { 
    ... 
    User(ICoordinateMapper coordinateMapper = nullptr) 
    : _coordMapper(coordinateMapper){} 
    ... 
}; 

我會推薦第二種方式,因爲它會初始化_coordMapper成員。

+0

謝謝!使用默認參數是有道理的 - 這就是我所缺少的。 – tyhenry

相關問題