У меня есть вопрос о наследовании статических членов и их защите в C++. Я надеюсь, что я буду достаточно ясен, так как не всегда легко записывать состояния ума :) Я пишу простой (текстовый синтаксический анализатор) для графической программы, которая загружает текстовый файл с пользовательским форматированием, теперь текстовая часть почти готова и теперь мне нужно создать несколько объектов, чтобы передать им данные, которые я загрузил из файла.
Я считаю, что этот вопрос относится к часу 1 C++, но я застрял. Например, я загрузил из текстового файла только 2 типа логических «узлов», LAYER и PLINE, у них также есть атрибуты, которые могут быть или не быть общими для обоих. Отношение LAYER к PLINE и обратно сейчас совершенно не имеет значения, меня беспокоит то, как подключить и обрабатывать атрибуты обоих:
Предположим, я выбрал DataObj в качестве базового класса для обоих. DataObj имеет элемент с именем «имя», потому что и LAYER, и PLINE могут иметь имя. СЛОЙ имеет атрибут, который является общим только для слоя, например. «заблокировано», а PLINE имеет атрибут, который является общим только для pline, например. "цвет". В «школьном стиле» это выглядело бы так:
/// i use const char* for everything to not complicate things ...
...
class DataObj {
...
const char* name;
...
}
...
class Layer : public DataObj {
...
const char* locked;
...
}
...
class Pline : public DataObj {
...
const char* color;
...
}
...
int main(){
Layer* l = new Layer();
l.name = "first layer";
l.locked = "false";
Pline* p = new Pline();
p.name = "wonderful line";
p.color = "0xFF3300";
}
...
Теперь я хочу сделать это более «динамически», так как я действительно не беспокоюсь о статических типизированных именах членов (и, возможно, их аксессорах в будущем), особенно при подаче объектов данными, поступающими из синтаксического анализатора. Я имею в виду, что это легко сделать только с двумя типами узлов, но у меня их будет более дюжины.
Итак, концепция, которую я хочу сделать, состоит в том, чтобы «статически» нажимать вектор разрешенных атрибутов для каждого типа узла (класса), а затем только выполнять проверки, разрешен ли этот атрибут в объекте, и устанавливать его во время синтаксического анализа. Возможно, я хочу иметь 2 важных члена: 1. это std::map пар kv, второй - статический вектор разрешенных атрибутов для определенного узла. Следуя коду, введенному ранее:
...
class DataObj {
...
static std::vector<const char*> allowedAttrs;
std::map <const char*, const char*> attrs;
private:
static bool isInit;
...
}
...
DataObj::DataObj(){
if(!isInit)
allowedAttrs.push_back("name");
isInit = true;
}
...
Layer::Layer(){
if(!isInit) // private static for Layer
allowedAttrs.push_back("locked");
}
...
Pline::Pline(){
if(!isInit) // private static for Pline
allowedAttrs.push_back("color");
}
...
Проблема, которую я получаю здесь, вероятно, видна с Луны. Если мы инициируем сначала новый слой, а затем новый Pline, Pline будет иметь имя, заблокировано и цвет в векторе allowAttrs, и это неправильно, потому что «заблокировано» должно быть действительным только для узла слоя.
Поэтому мне нужен какой-то способ решить эту проблему таким образом, чтобы член «allowedAttrs» стал «частным» для необычных атрибутов, таких как «заблокировано» в объекте слоя, но также сохранил свой «общедоступный» характер из суперкласса «DataObj» - поэтому он может перехватывать общие атрибуты, такие как «имя». Другими словами, я не хочу «разбивать» «поток наследования», идущий вверх к базовому классу, и определять новую переменную для каждого класса узла (объекта), повторяя один и тот же код снова и снова. (что-то вроде виртуальной переменной).
Я надеюсь, что этот вопрос не (такой) глупый, и я действительно буду признателен за ваши ответы.
static
- person Mooing Duck   schedule 02.10.2012i use const char* for everything to not complicate things
Неверно, ИМО. Вместо этого вы должны были использоватьstd::string
. - person Mahesh   schedule 02.10.2012