Я пытаюсь создать «родительский» класс, который предоставляет общий конструктор и типы параметров для всех его унаследованных классов. Единственное, что изменяется между унаследованными, это значение некоторых статических переменных.
Каков наилучший подход для достижения этой цели? Это моя текущая попытка:
class Ball {
public:
virtual ~Ball();
Ball ();
protected:
static string file;
static int size;
node shape;
};
class TenisBall: public Ball {};
class OtherBall: public Ball {};
Ball::Ball () {
shape = // do something with file and size
};
Ball::~Ball () {
delete shape;
};
string TenisBall::file = "SomeFile";
int TenisBall::size = 20;
string OtherBall::file = "OtherFile";
int OtherBall::size = 16;
Моя проблема в том, что я не могу установить статические значения для классов TenisBall
и OtherBall
, компилятор принимает их, только если я изменяю TenisBall
и OtherBall
на Ball
в последних двух строках кода.
Как я могу сделать это? Это лучший подход?
EDIT:
Следуя предоставленным ответам, я решил попытаться реализовать его с помощью виртуальных функций. Вот мой код:
class Ball {
public:
Ball () {
shape = // do something with getSize and getFile
};
~Ball () {
delete shape;
};
protected:
virtual string getFile(){ return "Fake"; };
virtual int getSize(){ return 10; };
node shape;
};
class TenisBall: public Ball {
int getSize() { return 16; };
string getFile() { return "TennisBall.jpg"; };
};
int main() {
TenisBall ball;
return 1;
};
Но, хотя мой редактор (xCode) не выдает никакой ошибки, при попытке компиляции llvm выдает следующую ошибку:
недопустимый символ '_' в идентификаторе пакета в столбце 22. Эта строка должна быть идентификатором универсального типа (UTI), который содержит только буквенно-цифровые (AZ, az, 0-9), дефис (-) и точку (.) символы.