Последовал совету Hyborg и написал генератор классов из xml в cpp с помощью xslt.
Впринципе xslt оказался достаточно простым для человека который ни разу с ним не работал.
Приветствуются мысли о том, как можно это сделать проще 🙂
Последовал совету Hyborg и написал генератор классов из xml в cpp с помощью xslt.
Впринципе xslt оказался достаточно простым для человека который ни разу с ним не работал.
Приветствуются мысли о том, как можно это сделать проще 🙂
как с тобой связаться? есть предложение!
С помощью XSLT как-то не наглядно получается, но дело вкуса. Просто, потом редактировать 1000-2000 строк xslt как-то пакостно 🙂
И ещё, у тебя получается одноразовая генерация класса? При повторной генерации пользовательский код перетирается? Или в C++ есть Partical классы как в .NET?
Есть идея использовать классы-хранилища-загрузчики для переменных отдельных классов. Без всякого наследования между ними. Пусть классы-пользователи решают проблему доступа к данным.
Вот пример (я сижу на VB, сильно не плюйся :))
XML ———————
CPP ——————-
public abstract class Object
{
public virtual bool LoadValues(string storageName, string storagePrefix, string sceneName, string objectName)
{
DataStorage* theDataStorage = DataStorage::Open(storageName);
return LoadValues(theDataStorage, storagePrefix, sceneName, objectName);
}
public abstract bool LoadValues(DataStorage* storage, string storagePrefix, string sceneName, string objectName);
}
public class FPSCounter : public Numeric
{
private FPSCounterValues* theValues;
public virtual bool LoadValues(DataStorage* storage, string storagePrefix, string sceneName, string objectName)
{
if (!Numeric::LoadValues(storage, storagePrefix, sceneName, objectName))
return false;
return theValues->LoadValues(storage, storagePrefix, sceneName, objectName);
}
public void DoSomething()
{
SetFont(FPSCounterValues->Font);
}
}
public class BaseValues : public Object
{
//…
}
// Этот класс создаёт генератор
public class FPSCounterValues : public BaseValues
{
private const string FontDefault = «MainFont»;
private const int FontSizeDefault = 24;
private const float XBaseDefault = 0.0;
public string Font;
public string Text;
public int FontSize;
public float XBase;
public void FPSCounterValues() : BaseValues()
{
Font = FontDefault;
FontSize = FontSizeDefault;
XBase = XBaseDefault;
}
public virtual bool LoadValues(storage, string storagePrefix, string sceneName, string objectName)
{
try
{
Font = storage->GetStringValue(storage_prefix + «font», FontDefault);
FontSize = storage->GetIntValue(storage_prefix + «font_size», FontSizeDefault);
XBase = storage->GetFloatValue(storage_prefix + «x_base», XBaseDefault);
return true;
}
catch(…)
{
// Do something…
}
return false;
}
}
А что это блог теги не не понимает, и xml зарезал?
<?xml version="1.0"?>
<class name="FPSCounterValues">
<property name="Text" type="String"/>
<property name="Font" type="String" default="MainFont" loadable="true"/>
<property name="FontSize" type="int" default="24" loadable="true"/>
<property name="XBase" type="float" default="0.0" loadable="true"/>
</class>
Предполагается далее унаследоваться от этого класса и уже там писать пользовательский код. Этот класс — просто хранилище и он не знает что это за данные и как с ними работать