什么是存储应用程序设置的相当标准的方式,主要用于Windows,但也很容易移动到其他平台.
基本上我想拥有4组设置:
每个级别都会覆盖以前的级别,允许"全局设置"使应用程序默认值更大,用户设置存储用户选择的选项.前两个基本上是没有用户设置的默认值(例如,对于新用户).
我认为实施一系列的功能,然后我可以实现对不同系统(可能是通过INI文件),但是这是最好的办法吗?
(C++)
namespace config
{
void Init(const std::string &AppName);
//updates config for keys/sections that don't exist (ie don't overwrite changes by advanced users by rewriting the entire file)
void Defaults (std::map<std::string,std::map<std::string,std::string> > &Map);
void SystemDefaults (std::map<std::string,std::map<std::string,std::string> > &Map);
void Set (const std::string &Section, const std::string &Key, const std::string &Value);
void SetSystem (const std::string &Section, const std::string &Key, const std::string &Value);
void SetUser (const std::string &Section, const std::string &Key, const std::string &Value);
void SetUserSystem …Run Code Online (Sandbox Code Playgroud) 我想使用new和delete运算符来创建和销毁我的对象.
问题是python似乎把它分成了几个阶段.tp_new,tp_init和tp_alloc用于创建,tp_del,tp_free和tp_dealloc用于销毁.但是c ++只有new,它分配并完全构造对象和删除对象的析构和解除分配.
我需要提供哪些python tp_*方法以及它们必须做什么?
此外,我希望能够直接在c ++中创建对象,例如"PyObject*obj = new MyExtensionObject(args);" 我是否还需要以某种方式重载新运算符以支持此操作?
我也希望能够在python中继承我的扩展类型,我需要做些什么来支持这个?
我正在使用python 3.0.1.
编辑:好的,tp_init似乎使对象有点太可变了我正在做的事情(例如,取一个Texture对象,在创建后改变内容很好,但改变它的基本方面,如size,bitdept等会破坏许多现有的c ++东西,假设这些东西是固定的).如果我没有实现它,它只会阻止人们在构造之后调用__init__(或者至少忽略调用,就像元组一样).或者,如果在同一个对象上多次调用tp_init,我是否应该有一些抛出异常或某事的标志?
除此之外,我认为其余的大部分已经排序.
extern "C"
{
//creation + destruction
PyObject* global_alloc(PyTypeObject *type, Py_ssize_t items)
{
return (PyObject*)new char[type->tp_basicsize + items*type->tp_itemsize];
}
void global_free(void *mem)
{
delete[] (char*)mem;
}
}
template<class T> class ExtensionType
{
PyTypeObject *t;
ExtensionType()
{
t = new PyTypeObject();//not sure on this one, what is the "correct" way to create an empty type object
memset((void*)t, 0, sizeof(PyTypeObject));
static PyVarObject init = {PyObject_HEAD_INIT, 0}; …Run Code Online (Sandbox Code Playgroud) 我是否正确地假设向std :: map添加/删除元素不会影响其他元素(即使它们在内存中重新定位),以便以下是安全的:
我查看了有关容器信息的各个站点,但只发现了迭代器失效的情况,我已经知道...
std::map<std::string,std::string> map;
PopulateMap(map);
std::string &a= map["x"];
AddMoreData(map);
RemoveRandomKeysExceptX(map);
map["x"] = "foo";
std::cout << a << " " << map["x"] << std::endl;//prints "foo foo"
a = "bar";
std::cout << a << " " << map["x"] << std::endl;//prints "bar bar"
Run Code Online (Sandbox Code Playgroud)
我在VC9上测试了一些类似的代码,但这似乎不起作用,但这并不意味着我不仅仅是幸运,也不是因为编译器没有变化.
我什么时候应该继续创建派生类,何时应该在我的代码中添加条件?例如导弹
class Object;
class Projectile : public Object;
class Missile : public Projectile;
class MissileGuided : public Missile;
Run Code Online (Sandbox Code Playgroud)
或者我应该在导弹的代码中实现最后一个?
void Missile::Update()
{
if(homing && ObjectExists(Target))
TurnTowards(Target.Pos)
Pos += Motion;
}
Run Code Online (Sandbox Code Playgroud)
我认为,对于所有更精细的细节,第二个更好,因为你开始获得事物的组合(例如,一些导弹可能不会在雷达上显示,一些可能是可破坏的,一些可能会获得新目标,如果原件被破坏或超出范围等)
然而,对于在某些情况下共用导弹属性的常规射弹也是如此(例如可能是可破坏的,大型射弹可能在雷达上显示等)
然后我可以说弹丸与船只共享属性(移动,碰撞它们会造成损坏,可能在雷达上显示,可能是可破坏的......)
然后一切都像3个类一样回归:
class Entity;
class Object : public Entity;
class Effect : public Entity;
Run Code Online (Sandbox Code Playgroud)
在创建派生类和使用标志或其他东西实现方法中的功能之间划清界线的好处在哪里?
我知道ICU和小型库,比如代码项目上的utf8(忘记了确切的名称),但这些都不是我想要的.
我真正想要的是像ICU这样的东西,但是以更友好的方式结束.
特别:
如果不存在这样的库,是否可以使用标准c ++类包装ICU,所以我可以创建一个与std :: string和std :: wstring具有相同用法的ustring,并且还可以实现流的版本(最好是它们与现有的完全兼容,即我可以将它传递给期望std :: ostream的函数,并且它将在其内部格式和ascii(或utf-8)之间执行转换)?假设可能会有多少工作?
编辑:还看了c ++ 0x标准并注意到utf8,utf16和utf32的文字,这是否意味着标准库(例如字符串,流等)将完全支持那些编码和它们之间的转换?如果是这样,任何人都知道Visual Studio将支持这些功能需要多长时间?
EDIT2:至于使用现有的c ++支持,我会查找locale和facet的东西.
我遇到的一个问题是,当使用围绕wchar_t定义的流(在Windows下为文件i/o时为2个字节)时,它似乎仍然使用ascii作为文件自己.
std::wofstream file(L"myfile.txt", std::ios::out);
file << L"Hello World!" << std::endl;
Run Code Online (Sandbox Code Playgroud)
导致文件中的以下十六进制
48 65 6C 6C 6F 20 57 6F 72 6C 64 0D 0A
这显然是ascii而不是预期的utf-16输出:
FF FE 48 00 65 00 6C 00 6C 00 6F 00 20 00 57 00 6F 00 72 00 6C 00 64 00 0D 00 0A 00
目前我已经使用以下方法获得了一些引用计数类:
class RefCounted
{
public:
void IncRef()
{
++refCnt;
}
void DecRef()
{
if(!--refCnt)delete this;
}
protected:
RefCounted():refCnt(0){}
private:
unsigned refCnt;
//not implemented
RefCounted(RefCounted&);
RefCounted& operator = (RefCounted&};
};
Run Code Online (Sandbox Code Playgroud)
我还有一个处理引用计数的智能指针类,虽然它没有统一使用(例如,在一两位性能关键代码中,我最小化了IncRef和DecRef调用的数量).
template<class T>class RefCountedPtr
{
public:
RefCountedPtr(T *p)
:p(p)
{
if(p)p->IncRef();
}
~RefCountedPtr()
{
if(p)p->DecRef();
}
RefCountedPtr<T>& operator = (T *newP)
{
if(newP)newP->IncRef();
if(p) p ->DecRef();
p = newP;
return *this;
}
RefCountedPtr<T>& operator = (RefCountedPtr<T> &newP)
{
if(newP.p)newP.p->IncRef();
if(p) p ->DecRef();
p = newP.p;
return *this;
}
T& operator *() …Run Code Online (Sandbox Code Playgroud) 我需要能够绘制SVG图像(能够缩放,并将图像旋转90,180和270度).
我还希望能够将图像渲染到位图(例如用于显示),以便能够将它们绘制成新的SVG图像(将"文档"导出到SVG).
wxWidgets似乎没有任何内置的SVG功能,所以我不知道如何继续添加这样的功能.
在 Python 中创建类时,我可以简单地创建一个def __len__(self):方法来完成len(InstanceOfMyClass)工作,但是我不知道如何通过 C-API 使用扩展类来执行此操作。
我尝试添加一个__len__方法,但这似乎不起作用
{"__len__",(PyCFunction)&TestClass_GetLen,METH_NOARGS,""},
Run Code Online (Sandbox Code Playgroud)
Python测试代码:
def test(my_instance):
x = len(my_instance)#exception
return x
TypeError: object of type 'test_module.test_class' has no len()
Run Code Online (Sandbox Code Playgroud)
测试类代码
struct TestClass;
static int TestClass_Init(TestClass *self, PyObject *args, PyObject* kwds);
static void TestClass_Dealloc(TestClass *self);
static PyObject* TestClass_GetLen(TestClass *self);
struct TestClass
{
PyObject_HEAD;
};
static PyMethodDef TestClass_methods[] =
{
{"__len__",(PyCFunction)&TestClass_GetLen,METH_O,""},
{NULL}
};
static PyTypeObject TestClass_type = {PyObject_HEAD_INIT(NULL)};
bool InitTestClass(PyObject *module)
{
TestClass_type.tp_basicsize = sizeof(TestClass);
TestClass_type.tp_name = PY_MODULE_NAME".TestClass";
TestClass_type.tp_doc = ""; …Run Code Online (Sandbox Code Playgroud) 我的一些旧代码最终出现了一堆令人讨厌的黑客行为,以使事情“正确”工作,在移动物体和相机方面,例如必须采用“std::sin(-yaw)”而不是“std::sin(yaw)”在实现在线其他地方找到的方程时,通常会让一切变得混乱,在许多情况下都达到了追踪和错误的程度。
使用 D3D11 和 DirectXMath 的东西(所以左手坐标和行主?),预期的坐标系到底是什么,例如假设相机位于原点并沿着图像中的黄色向量看而不旋转,标签是否正确?。

然后考虑到这一点,以及由(x,y,z)和俯仰(y轴鼠标/控件),偏航(x轴鼠标/控件)描述的相机,并假设我没有其他方法应该做即使...
获取视图矩阵的正确函数是什么(当前我乘以一个平移矩阵和两个旋转矩阵,乘以投影,然后乘以相关对象的任何世界矩阵,并将结果转置以用作单个着色器常量)。
获取相机所观察的向量的方程是什么(当前将 (0,0,1) 向量乘以 2 中的矩阵)。
编辑:代码示例:
//Moving a floating object with only yaw forwards (moveX,moveY,moveZ).
//Negative yaw seems wrong?
auto c = std::cosf(-yaw);
auto s = std::sinf(-yaw);
pos.x += moveX * c - moveZ * s;
pos.y += moveY;
pos.z += moveX * s + moveZ * c;
//Gets the vector the camera is looking along
//This time yaw is positive, but pitch is negative?
float c = …Run Code Online (Sandbox Code Playgroud) 在使用XAudio2和Direct3D9/10的应用程序中显示视频(有声!)的最佳/最简单方法是什么?
至少它需要能够流式传输更大的视频,并注意窗口宽高比可能与视频不同的事实(例如通过添加信箱),尽管理想情况下我喜欢将视频嵌入到视频中的能力一个3D场景.
我当然可以设法将每个帧加载到纹理中,一旦渲染就丢弃/重复使用纹理,并通过XAudio2单独播放音频,但是除了编写至少一种格式的加载器之外,还必须处理喜欢同步视频和音频组件之类的东西,所以希望有一个更好的解决方案,甚至是现成的免费解决方案(二进制形式的商业发行,动态链接在LGPL的情况下很好).