2016-08-23 4 views
-1

Я использую VS (2015) в C++ в первый раз и являюсь новичком при создании полупристойного кода. Попытка сделать что-то простое - использовать список инициализатора ... но это бросает эту ошибку: «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