2016-08-23 1 views
-1

J'utilise VS (2015) en C++ pour la première fois, et je suis un novice dans la création de code décent à mi-chemin. Essayer de faire quelque chose de simple - utiliser une liste de initialiseur ... mais il lancer cette erreur: « C2280: tentative de référencer une fonction supprimée »C++ initializer liste problème - erreur: tentative de référence d'une fonction supprimée

Je (User.h):

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

Si je surcharger le constructeur comme suit, il fonctionne très bien:

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

Mon application est exécutée (par openFrameworks) comme:

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

deApp.h:

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

Pourquoi est-ce? Je pensais que je n'avais pas besoin de surcharger le constructeur lors de l'utilisation des listes d'initialisation? Ou est-ce que je

Répondre

2

Dans la première variante, où vous n'avez pas de constructeur par défaut User, le compilateur ne créera pas un constructeur par défaut pour vous. Cela signifie qu'il n'y a aucun moyen de construire par défaut (comme vous le faites dans la classe ofApp) un objet de la classe User.

Il existe deux façons de résoudre le problème: La première que vous connaissez déjà et qui consiste à créer un constructeur par défaut. En variante de ce que vous pourriez utiliser les compilateurs constructeur par défaut en utilisant

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

L'autre solution consiste à utiliser des arguments par défaut pour l'autre constructeur, il peut donc être invoqué sans arguments comme un constructeur par défaut:

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

Je recommanderais la deuxième façon, car elle initialisera le membre _coordMapper.

+0

Merci! Utiliser un argument par défaut est logique - c'est ce qui me manquait. – tyhenry