2017-07-24 3 views
0

J'ai une variable player qui contient un vecteur de Resource classe qui dérive de Name et ID classe.C++ classe de base invoque une fonction supprimée ou inaccessible

Le problème se situe lorsque je compile le code et les erreurs suivantes apparaissent pendant la compilation.

resources.h(27): note: 'Resources &Resources::operator =(const Resources &)': function was implicitly deleted because a base class invokes a deleted or inaccessible function 'IdClass &IdClass::operator =(const IdClass &)' 

idclass.h(11): note: 'IdClass &IdClass::operator =(const IdClass &)': function was implicitly deleted because 'IdClass' has a data member 'IdClass::id' of const-qualified non-class type 

idclass.h(4): note: see declaration of 'IdClass::id' 

En fait ce que je faisais dans Resources.cpp est, j'avais une fonction qui initialise les ressources du vecteur du joueur. J'ai été dérangé par cette erreur parce que je n'ai pas regardé autour dans StackOverflow pour quelques réponses mais je n'ai pas vu quelques réponses utiles. Ce link est venu près mais je ne suis pas sûr si changer le const dans une valeur non const est ce dont j'ai besoin.

Voici le code.

dans Resources.h

#include "NameClass.h" 
#include "IdClass.h" 
#include "settings.h" 
class PlayerClass; 
class Resources : public NameClass, public IdClass 
{ 
public: 
    /*Sets the name and id*/ 
    Resources(string n, const short identifier):NameClass(n), IdClass(identifier){} 
    static void InitializeResourceContainer(PlayerClass& player){ 
     // playerInv is a struct 
     // rssContainer is a vector<Resources> 
     // name_x and id_x comes from settings.h which is #defined 
     player.playerInv.rssContainer.push_back(Resources(name_Stone, id_Stone)); 
     player.playerInv.rssContainer.push_back(Resources(name_Wood, id_Wood)); 
     player.playerInv.rssContainer.push_back(Resources(name_Plastic, id_Plastic)); 
     player.playerInv.rssContainer.push_back(Resources(name_Thatch, id_Thatch)); 
     player.playerInv.rssContainer.push_back(Resources(name_Fabric, id_Fabric)); // this is line 27 

     // plus a lot of resources 
    } 
} 

dans IdClass.h

class IdClass 
{ 
    const short id;// line 4 
public: 
    /*Sets the id*/ 
    IdClass(const short idToSet); 
    /*returns the id*/ 
    short GetId() const; 
}; // line 11 

dans IdClass.cpp

#include "IdClass.h" 

/*Sets the id*/ 
IdClass::IdClass(const short idToSet) : id(idToSet) 
{ 
} 

/*returns the id*/ 
short IdClass::GetId() const { return id; } 

Ceci est un petit morceau de code, je travaille sur . Si vous avez besoin de plus d'explications ou de code, je peux en donner dans les commentaires ci-dessous.


Edit 1: On dirait que j'ai oublié de placer le code d'erreur après la sortie. De plus, je suis en utilisant Visual Studio 2017

Error C2280 'Resources &Resources::operator =(const Resources &)': attempting to reference a deleted function f:\visual studio\2017\vc\tools\msvc\14.10.25017\include\xutility 2310 

Changer la variable const short-short en IdClass.h créerait une erreur de liens dans une de mes classes. Donc, évidemment, les deux threads que deux commentateurs n'étaient pas très utiles.

Ce que je vise à faire est d'obtenir la valeur d'ID de Resources.h à IdClass.h.

+1

Je ne vois que des 'notes', pas des erreurs. Est-ce qu'il construit un exécutable, ou y a-t-il des erreurs que vous ne montrez pas? La note dit fondamentalement "ne peut pas faire un opérateur d'assignation par défaut, à cause du membre const". – Baldrick

+0

vous voulez savoir comment copier un objet quand il a des membres 'const'? – user463035818

+0

lire la réponse acceptée ici: https://stackoverflow.com/questions/634662/non-static-const-member-cant-use-default-assignment-operator Il explique pourquoi vous ne pouvez pas utiliser '=' sur les objets qui ont const membres . Si le projet se construit correctement, et que vous n'attribuez pas 2 objets de ressources de type, vous devriez être OK –

Répondre

0

Vous avez résolu votre premier problème en changeant const court à court. C'était votre dernière erreur de compilation, alors vous êtes passé à l'étape de liaison. Cela a exposé votre deuxième erreur (non liée!), Une chaîne statique playerName dans la classe FileManager qui a une déclaration, mais pas de définition.

En C++, il ne suffit pas de « déclarer » statique tel que

class A 
{ 
static int a; 
} 

vous devez également « définir », ou lui donner un corps en ajoutant la ligne suivante dans un fichier d'Cpp (pas .h car il peut obtenir plusieurs fois défini re-)

int A::a = 0; 

Cependant, je ne suis pas sûr que vous voulez vraiment playername être membre statique dans la classe FileManager. Cela signifierait que de nombreux gestionnaires de fichiers partageraient tous le même nom de joueur.

0

Votre classe IdClass n'est pas copiable/mobile en raison de membre const

const short id; 

À la suite de votre classe de ressources ne devient pas copiable/mobile, mais il est nécessaire par std :: vecteur.

Supprimer const de short id pour le compiler.

+0

il a fait des erreurs de lien avec un de mes fichiers si – CraftedGaming

+0

votre erreur de lien n'est pas liée –