I have a player
variable which contains a vector of Resource
class which derived from Name
and ID
class.
Problem lies when I'm compiling the code and the following errors appear during 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'
Basically what I did in Resources.cpp
is, I had a function that initializes the Resources of the player's vector. I was weirded out by this error because I did not I looked around in StackOverflow for some answers but I haven't seen some helpful answers. This link came close but I'm not sure if changing the const into a non const value is what I need.
Here's the code.
in 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
}
}
in 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
in IdClass.cpp
#include "IdClass.h"
/*Sets the id*/
IdClass::IdClass(const short idToSet) : id(idToSet)
{
}
/*returns the id*/
short IdClass::GetId() const { return id; }
This is a small piece of the code I'm working on. If you guys need more explanation or code, I can give some in the comments below.
Edit 1: Looks like I forgot to place the error code after the output. Also I'm using 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
Changing the variable from const short
to short
in IdClass.h would create a linker error in one of my classes.
Error LNK1120 1 unresolved externals
Error LNK2001 unresolved external symbol "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > FileManager::playerName" (?playerName@FileManager@@0V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A) ArchizzleGame C:\Users\CraftedGaming\Documents\Visual Studio 2017\Projects\ArchizzleGame\ArchizzleGame\FileManager.obj 1
So obviously the two threads that two commenters linked weren't that helpful.
What I aim to do is to get the id value from Resources.h to IdClass.h.
You solved your first problem by changing const short to short. This was your last compilation error , so you moved to the linking stage. This exposed your second (unrelated!) error, a static string playerName in class FileManager which has a declaration , but no definition.
In c++ it is not enough to "declare" a static such as
class A
{
static int a;
}
you also need to "define" it, or give it a body by adding the following line in some .cpp file ( not .h as it may get re-defined multiple times )
int A::a = 0;
However, I'm not sure you really want playerName to be a static member in class FileManager. This would mean many file managers would all share the same player name.