使用CodeSynthesis XSD树映射的C ++类型
我正在使用CodeSynthesis XSD C ++ / Tree Mapping实用程序将现有的xsd转换为可在其中填充值的c ++代码。这是我们始终确保遵循模式的方法。
完成转换后,我正在尝试使其正常运行,以便可以对其进行测试。问题是,我不习惯在c ++中执行此操作,这是我第一次使用此工具。
我从一个名为ABSTRACTNETWORKMODEL的类开始,其类型为versno_type和fromtime_type。
里面是typedef的。这是我尝试使用的构造函数以及typedef
ABSTRACTNETWORKMODEL(const versno_type&, const fromtime_type&); typedef ::xml_schema::double_ versno_type; typedef ::xml_schema::time fromtime_type;
所有这些都在ABSTRACTNETWORKMODEL类中,并且double_和time的定义是:
typedef ::xsd::cxx::tree::time<char, simple_type> time; typedef double double_;
其中time的定义是具有多个构造函数的类:
template<typename C, typename B> class time: public B, public time_zone { public: time(unsigned short hours, unsigned short minutes, double seconds); ... }
我知道我没有正确创建新的ABSTRACTNETWORKMODEL,但是我不知道该怎么做。这是我目前要做的所有事情:
::xml_schema::time t(); ABSTRACTNETWORKMODEL anm(1234, t);
当然,这会引发有关转换第二个参数的错误,但是有人可以告诉我这是不正确的吗?或者至少将我指出正确的道路,因为我现在要尝试做的一件事就是学习更多的c ++。
解决方案
在办公室周围问,看来我的问题不是创建ABSTRACTNETWORKMODEL,而是实际上是:: xml_schema :: time。
我感到奇怪的是,时间的实例化不会导致错误,因为它没有任何默认构造函数,或者即使模板和类型正确,为什么它也未被接受。
我以前被这个咬过。如果行:
::xml_schema::time t();
就像代码中出现的一样(即使用括号),那么问题是我们实际上并未像我们想象的那样实例化对象。
要实例化一个对象,我们将使用
::xml_schema::time t;
相反,第一行声明一个不带任何参数的函数t(),并返回一个类型为:: XML_schema :: time的对象。由于没有主体,因此编译器认为我们稍后将定义函数。它是完全合法的C ++,是人们做的很多事情(例如,在头文件中),因此编译器接受它,不会发出警告,因为它无法知道那不是你的意思,并且做了你想做的没想到。
当将该函数传递给ABSTRACTNETWORKMODEL构造函数时,我们会收到一个错误消息,因为我们无法将函数作为参数传递(可以将指针传递给该函数,并且可以调用该函数,并传递结果临时值):
::xml_schema::time t(); ABSTRACTNETWORKMODEL anm(1234, t()); // calls t(), gets a temporary of type ::xml_schema::time, and passes the temporary to the constructor
因此,"时间的实例化不会导致错误"的原因是,从未实例化时间对象。 time类也没有默认构造函数,并且尝试使用正确的语法实例化t会引发我们期望的错误。
为了便于记录,在某些情况下需要使用括号。例如,当实例化一个临时对象并在同一行中操纵该临时对象时:
int hours = time().get_hours(); // assuming that there is now a default constructor
因为删除第一组括号将导致错误:
int hours = time.set_time("12:00:00am"); // error: there is a time class, but no object named "time"
相信我,我真的很喜欢C ++,但是语法有时很难保持直截了当。