A ton of errors related to messy OOP code
I'm getting loads of errors with this when I compile. Hopefully things will become clearer for me if I solve one of them (if not then I can post the rest):
'Weapon' : illegal member initialization: 'Name' is not a base or member
It has that for Name and Cost. Weapon inherits Shopable, and Shopable has Name, Cost and Description in its protected section.
Shopable.h:
#ifndef _SHOPABLE_H_
#define _SHOPABLE_H_
#include "Library.h"
class Shopable{
protected:
    std::string Name;
    int Cost;
    std::string Description;
public:
    std::string getName() const{return Name;}
    int getCost() const {return Cost;}
    virtual std::string getDesc() const = 0;
};
#endif
Weapon.h:
#ifndef _WEAPON_H_
#define _WEAPON_H_
#include "Shopable.h"
class Weapon : public Shopable{
private:开发者_开发知识库
    int Damage;
public:
    Weapon(int c,int d,std::string n) : Cost(c), Damage(d), Name(n){}
    std::string getDesc() const{
        return getName()+"\t"+tostring(Damage)+"\t"+tostring(Cost);
    }
    int getDamage() const{return Damage;}
    int DamageTarget(Entity* target){
        int DamageDealt = 0;
        //do damage algorithm things here
        return DamageDealt;
    }
};
#endif
Library.h:
#ifndef _LIBRARY_
#define _LIBRARY_
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdarg>
#include <vector>
#include <ctime>
#include <cmath>
#include <cstdlib>
#include <map>
#include <exception>
#include <sstream>
//file includes
#include "Globals.h"
#include "Player.h"
#include "Exception.h"
#include "Weapon.h"
#include "Armour.h"
#include "Consumable.h"
//prototypes that require "Library.h"
bool Poglathon(std::vector<std::string>& text,Player *player);
bool PoglathonTown(std::vector<std::string>& text,Player *player);
std::map<std::string,Weapon*> init_weapons(void);
std::map<std::string,Armour*> init_armour(void);
std::map<std::string,Consumable*> init_consumables(void);
#endif //__LIBRARY__
Globals.h:
//global variables
#ifndef _GLOBAL_
#define _GLOBAL_
#include <vector>
#include <iostream>
#include <string>
//prototypes
void NPCTalk(std::string const& speaker,std::vector<std::string> const& text);
void wait(double seconds);
void regionChange(int amount);
int getPositionInStringVector(std::vector<std::string> const& vec,std::string value);
//variables
//defines
#define RegionChange 3
////tostring
template <class TYPE> std::string tostring(const TYPE & t ) {
    std::ostringstream os;
    os << t;
    return os.str();
};
#endif //__GLOBAL__
You can only initialize members of the current class in an initialization list.  Name (and Cost) are both members of the base class; they must be initialized in the base-class constructor.
The simplest way to do that is to add a constructor to Shopable:
class Shopable {
    ...
public:
    Shopable(std::string n, int c, std::string d)
    : Name(n), Cost(c), Description(d) {}
    ...
};
and then use that in the Weapon initialization list:
class Weapon : public Shopable {
    ...
public:
    Weapon(int c,int d,std::string n)
    : Shopable(n,c,""), Damage(d)
    {}
};
In
Weapon(int c,int d,std::string n) : Cost(c), Damage(d), Name(n){}
you cannot use members of the base class in the initialization list. Instead, define a proper constructor in Shoppable and call it like this:
Weapon(int c,int d,std::string n) : Shoppable(c, d, n)
You should make a constructor for Shopable and use that to initialize the inherited members.
class Shopable{
protected:
    std::string Name;
    int Cost;
    std::string Description;
public:
    std::string getName() const{return Name;}
    int getCost() const {return Cost;}
    virtual std::string getDesc() const = 0;
public:
    Shopable(std::string n, int c, std::string d) : Name(n), Cost(c), Description(d) {}
};
and
class Weapon : public Shopable{
private:
    int Damage;
public:
    Weapon(int c,int d,std::string n) : Shopable(n, c, "Weapon"), Damage(d) {} // should probably reorder the parameters to match, just for consistency
    std::string getDesc() const{
        return getName()+"\t"+tostring(Damage)+"\t"+tostring(Cost);
    }
    int getDamage() const{return Damage;}
    int DamageTarget(Entity* target){
        int DamageDealt = 0;
        //do damage algorithm things here
        return DamageDealt;
    }
};
 
         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论