• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Call to implicitly-deleted copy constructor of przy wywołaniu metody push_back

Object Storage Arubacloud
0 głosów
491 wizyt
pytanie zadane 17 maja 2017 w C i C++ przez neos Początkujący (320 p.)
zamknięte 17 maja 2017 przez neos

Witam, podczas używania metody push_back kompilator zwraca błąd "Call to implicitly-deleted copy constructor of 'Monsters' memory. Poniżej podaje cały kod programu. Podobnie robię w swoim innym programie, gdzie wszystko działa ładnie ( tam nie używam class zaprzyjaźnionych, ale to chyba nie ma nic do rzeczy).

 

class Hero
{
public:
    //features
    string name;
    int strenght;
    int dexterity;
    int HP;
    int intelligence;
    int charisma;
    fstream file;
    
    Hero(string ,int, int, int, int, int);
    Hero();
    void showStats();
    void save();
    void load(string path);
    
    
    friend class Magus;
    friend class Warrior;
    friend class Berserker;
    friend class Thief;
    
    
};

#include <iostream>
#include <stdio.h>
#include <fstream>
#include <vector>
#include "Hero.hpp"
#include "Thief.hpp"
#include "Warrior.hpp"
#include "Magus.hpp"
#include "Berserker.hpp"
#include "Monsters.hpp"
#include "Libraries.hpp"

using namespace std;


class Engine
{
public:
    int menuChoose;
    
    enum EngineState {MENU,CREATE_HERO,SAVE_HERO,LOAD_HERO,CHANGE_STATS,CREATE_MONSTERS,END};
    EngineState state;
  
    Hero hero;
    Magus magus;
    Berserker berserker;
    Warrior warrior;
    Thief thief;
    Monsters monster;

    vector<Monsters>::const_iterator iterMonster;
    vector<Monsters> MonstersArray;
    

    Engine();
    
    int menuEngine();
    void startEngine();
    void createHero();
    void save();
    void load();
    void change_stats();
    void create_monster();
    void save_monsters();
    
    
    
    
};
//
//  Engine.cpp
//  KonstruktoryDestruktory
//
//  Created by Mac Paweł on 12.05.2017.
//  Copyright © 2017 Macbook PRO 13. All rights reserved.
//



void Engine::startEngine()
{
    while(state != END)
    {
        //program loop
        
        system("clear");
        
        switch (state)
        {
            case EngineState::MENU :
                menuEngine();
                break;
                
            case EngineState::CREATE_HERO :
                createHero();
                break;
                
            case EngineState::SAVE_HERO :
                save();
                    
                break;
                
            case EngineState::LOAD_HERO :
                load();
                break;
                
            case EngineState::CHANGE_STATS:
                change_stats();
                break;
                
            case EngineState::CREATE_MONSTERS:
                //
                break;
                
                
            case EngineState::END :
                
                //exit
                break;
                
        }
        
    }
    
}


void Engine::create_monster()
{
    
    bool choose2 = false;
    int choose_option;
    while(state!=MENU)
    {
        hero.showStats();
        cout<<"1. Create monster "<<endl;
        cout<<"2. Save Monster "<<endl;
        cout<<"3. Back do Menu "<<endl;
        cin>>choose_option;
        
        //ENTER ERROR CONTROL
        if(choose_option ==1 || choose_option==2 || choose_option==3)
        {
            choose2 = false;
        }
        else choose2 = true;
        
        while(choose2 == true)
        {
            cout<<"Choose again! ( 1 or 2 or 3)"<<endl;
            cin>> choose_option;
            if(choose_option==1 || choose_option == 2 || choose_option==3)
            {
                choose2 = false;
            }
            else choose2 = true;
        }
  
        switch (choose_option)
        {
            case 1:
            {
                
                cout<<"Enter monsters names: ";
                cout<<"Enter Monster1 name: ";
                cin>>monster.name;
                cout<<"Monster1 name is: "<<monster.name;
                MonstersArray.push_back(monster);
                
                cout<<"Enter Monster2 name: ";
                cin>>monster.name;
                cout<<"Monster2 name is: "<<monster.name;
                MonstersArray.push_back(monster);
                cout<<"Enter Monster3 name: ";
                cin>>monster.name;
                cout<<"Monster3 name is: "<<monster.name;
                MonstersArray.push_back(monster);
                cout<<"Enter Monster4 name: ";
                cin>>monster.name;
                cout<<"Monster4 name is: "<<monster.name;
                MonstersArray.push_back(monster);
                cout<<"Enter Monster5 name: ";
                cin>>monster.name;
                cout<<"Monster5 name is: "<<monster.name;
                MonstersArray.push_back(monster);

   
                break;
            }
                
            case 2:
            {
                cout<<"Saving monsters to file"<<endl;
                int counterMonster = 0;
                for(iterMonster=MonstersArray.begin(); iterMonster !=MonstersArray.end(); iterMonster++)
                {
                    
                    MonstersArray[counterMonster].save();
                    counterMonster++;
                }
                break;
                 
            }
            
            case 3:
            {
                state=MENU;
                break;
            }
                
        }
        system("clear");
        
    } 
}

class Monsters:public Hero { public: Monsters(); };

Monsters::Monsters()
{
   
    name = "";
    strenght = generateRandom(10);
    dexterity =generateRandom(10);
    HP = generateRandom(10);
    intelligence = generateRandom(10);
    charisma = generateRandom(10);
    
}

Problem występuje przy metodzie push_back w Engine.cpp

komentarz zamknięcia: Rozwiązane

1 odpowiedź

+2 głosów
odpowiedź 17 maja 2017 przez MetGang Nałogowiec (34,360 p.)
wybrane 17 maja 2017 przez neos
 
Najlepsza
W wielkim skrócie. Klasa sama w sobie nie jest kopiowalna jeśli ma w sobie obiekt, który jest niekopiowalny. Monster, który dziedziczy z Hero ma w sobie klasę std::fstream (z Hero), która jest niekopiowalna, a std::vector wymaga, aby klasa była kopiowalna (miała copy-constructor) lub miała move-constructor.
1
komentarz 17 maja 2017 przez criss Mędrzec (172,590 p.)
edycja 17 maja 2017 przez criss

Najsensowniejszym rozwiązaniem byłoby chyba trzymanie jedynie ścieżki do pliku jako pola zamiast obiektu fstream.

Druga opcja to napisanie swojego copy ctora dla Monsters.

Kolejna opcja to z klasy Engine wywalić pole monster (właściwie to nie widze powodu dla którego to jest pole, a nie obiekt lokalny w Engine::create_monster), a zamiast tego tworzyć obiekt lokalny. Ostatecznie przy push_back wymusić move ctor poprzez std::move.

Monsters monster;
cout<<"Enter Monster1 name: ";
cin>>monster.name;
cout<<"Monster1 name is: "<<monster.name;
MonstersArray.push_back(std::move(monster));

Btw. dlaczego dodawania monsterów nie realizujesz w pętli? Masa zduplikowanego kodu.

PS:
 

name = "";

Niepotrzebne - std::string jest klasą i jej konstruktor dba o inicjalizacje (obiektów nie trzeba inicjalizować).

komentarz 17 maja 2017 przez neos Początkujący (320 p.)
Działa. Usunąłem klasę fstream z klasy Hero. Zrobiłem wówczas odpowiednie metody do wczytywania i zapisywania danych w klasie Engine. Dzięki wielkie za pomoc.

Podobne pytania

0 głosów
2 odpowiedzi 492 wizyt
0 głosów
1 odpowiedź 463 wizyt
0 głosów
1 odpowiedź 709 wizyt

92,538 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,923 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...