2016-12-09 2 views
0

Je continue d'obtenir l'erreur C2280 lorsque j'essaie d'ajouter un objet à un vecteur de type classe. Voici les fichiers qui me donnent l'erreurObtenir l'erreur C2280 en essayant d'ajouter un objet à un vecteur

'interfaceText::interfaceText(const interfaceText &)': attempting to reference a deleted function" 

interfaceText.h

#include<SFML/Graphics.hpp> 
#include<vector> 
#include<iostream> 
#include<math.h> 
#include<sstream> 
#include<ctime> 
#include<cstdlib> 
class interfaceText{ 
    private: 
     std::string createString(); 
     std::ostringstream stringStream; 
     sf::Text text; 
     sf::Vector2f position; 
     sf::Font font; 
     sf::Color color; 
     //DEBUG 
     int currentAngle = 1; 
     sf::Color generateRandomColors(); 

    public: 
     sf::Text returnRenderObject(); 
     interfaceText(sf::Vector2f textPosition, sf::Color textColor); 
     void updateText(float currentangle);//std::string string, sf::Vector2f textPosition, sf::Color textColor); 
}; 
extern std::vector<interfaceText> textArray; 

interfaceText.cpp

#include "interfaceText.h" 

interfaceText::interfaceText(sf::Vector2f textPosition, sf::Color textColor):position(textPosition),color(textColor){ 

    font.loadFromFile("AvenirNextLTPro-Cn.otf"); 
    text.setString(createString()); 
    text.setPosition(position); 
    text.setFont(font); 
    text.setColor(color); 
    textArray.push_back(*this); //<-Code that causes error? 
} 


std::string interfaceText::createString() { 
    std::string TESTSTRING="DEBUG"; 
    return TESTSTRING; 
} 

void interfaceText::updateText(float currentAngle){//std::string string,  sf::Vector2f textPosition, sf::Color textColor) { 
    text.setString(createString()); 
    position.x = (cos(currentAngle*3.14/180)* position.x/2); 
    position.y = (sin(currentAngle*3.14/180)* position.y/ 2); 
    text.setPosition(position); 
    text.setColor(generateRandomColors()); 
    //std::cout << text.getPosition().x<<" " << text.getPosition().y <<'\n'; 
    currentAngle+=1; 
} 

sf::Text interfaceText::returnRenderObject() { 
    return text; 
} 
sf::Color interfaceText::generateRandomColors() { 
    srand(time(NULL)); 
    sf::Color newColor (rand()%255, rand() % 255, rand() % 255,255); 
    return newColor; 
} 

Un dans main.cpp (ce qu'il ne sont pas tous parce que J'ai supprimé le code que j'ai jugé non pertinent)

#include"interfaceText.h" 
#include<vector> 
int main(){ 
    interfaceText newText(sf::Vector2f(100, 100), sf::Color(255, 255, 255, 255)); 
    return 0; 
} 

Je suis sûr que le code qui est à l'origine de cette erreur (ou au moins le déclenchement du compilateur pour donner un message d'erreur) est

textArray.push_back(*this); 

dans le fichier interfaceText.cpp

Il y a aussi quelques notes données avec le message d'erreur comme indiqué ci-dessous:

note: compiler has generated 'interfaceText::interfaceText' here 

see reference to function template instantiation 'void std::allocator<_Ty>::construct<_Objty,interfaceText&>(_Objty *,interfaceText &)' being compiled 

des notes que je suppose que le compilateur tente d'ajouter une nouvelle cteur pour la classe interfaceText mais je ne sais pas pourquoi

+1

Vous avez manqué un constructeur par défaut pour 'interfaceText'? –

+0

@ πάνταῥεῖ J'avais déjà essayé d'ajouter un constructeur par défaut mais cela n'a pas résolu le problème. Merci quand même pour vôtre aide – ThomasMartin

Répondre

1

Lorsque vous faites textArray.push_back(*this); vous faites une copie de l'objet. Malheureusement, vous ne pouvez pas copier un interfaceText car il contient un std::ostringstream. Un std::ostringstream n'est pas copiable, donc toute classe qui l'inclut en tant que membre a le constructeur de copie généré par défaut marqué comme supprimé.

Vous devrez soit créer votre propre constructeur de copie et y construire le std::ostringstream, soit déplacer l'instance dans le vecteur puisque les flux sont mobiles.