代码之家  ›  专栏  ›  技术社区  ›  Fry

使用代码合成XSD树映射的C++类型

  •  1
  • Fry  · 技术社区  · 17 年前

    我使用代码转换XSD C++ +树映射工具将现有的XSD转换成C++代码,我们可以在其中填充值。这就是我们总是确保遵循模式。

    在完成转换之后,我正在尝试让它工作,这样我就可以测试它了。问题是,我不习惯在C++中这样做,这是我第一次使用这个工具。

    我从一个名为AbstractNetworkModel的类开始 versno_type fromtime_type typedef'd在内部。这是我试图使用的构造函数以及typedef

    ABSTRACTNETWORKMODEL(const versno_type&, const fromtime_type&);
    typedef ::xml_schema::double_ versno_type;
    typedef ::xml_schema::time fromtime_type;
    

    所有这些都在AbstractNetworkModel类中,double_uu和time的定义是:

    typedef ::xsd::cxx::tree::time<char, simple_type> time;
    typedef double double_;
    

    其中时间的定义是一个具有多个构造函数的类:

    template<typename C, typename B>
    class time: public B, public time_zone
    {
      public:
      time(unsigned short hours, unsigned short minutes, double seconds);
      ...
    }
    

    我知道我没有正确地创建一个新的抽象网络模型,但我不知道我需要做什么。我现在要做的就是:

      ::xml_schema::time t();
      ABSTRACTNETWORKMODEL anm(1234, t);
    

    当然,这会在转换第二个参数时引发一个错误,但是有人能告诉我什么是不正确的吗?或者至少把我指向正确的路径,因为我现在要做的一件事就是学习更多的C++。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Max Lybbert    16 年前

    我以前被这个咬过。如果行:

    ::xml_schema::time t();
    

    正如它在代码中出现的那样(也就是说,使用parens),那么问题是您实际上并没有像您想象的那样实例化一个对象。

    要实例化要使用的对象

    ::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
    

    所以“时间的实例化没有导致错误”的原因是时间对象从未被实例化。时间类也没有默认的构造函数,并且试图用正确的语法实例化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++,但是语法会很难保持一些时间。

        2
  •  0
  •   Fry    17 年前

    在办公室里被问到,我的问题似乎不是创建AbstractNetworkModel,而是实际上是::xml_schema::time。

    我觉得奇怪的是,时间的实例化没有导致错误,因为它没有任何默认的构造函数,或者为什么它没有被接受,即使模板和类型是正确的。