【问题标题】:Wrapper around a class C++围绕类 C++ 的包装器
【发布时间】:2011-10-26 19:51:16
【问题描述】:

假设一个 C++ 类有一个构造函数(以及其他构造函数)

Foo::Foo( FILE *fp ) { etc... }

现在我想创建一个表单的包装类

class WFoo {
      Foo::Foo A;
      Foo::Foo B;
 };

带有构造函数

WFoo::WFoo(FILE *fa, FILE *fb) {
      A(fa), B(fb);
}

WFoo 的定义有什么问题? 提前致谢。

【问题讨论】:

    标签: c++ wrapper


    【解决方案1】:

    这没有任何意义......

    class WFoo {
          Foo::Foo A;
          Foo::Foo B;
     };
    

    你是说……

    class WFoo {
    public:
          Foo A;
          Foo B;
    
          WFoo(FILE* fa, FILE* fb);
     };
    
    WFoo::WFoo(FILE* fa, FILE* fb) :
        A(fa), B(fb)
    {
    }
    

    还要记住,字段的初始化不是按照您在构造函数中读取的顺序,而是按照它们在类中声明的顺序!

    所以...

    #include <iostream>
    
    struct XFoo
    {
        XFoo(const char* s) { std::cout << s << std::endl; }
    };
    
    struct YBar
    {
        XFoo a;
        XFoo b;
    
        YBar() : a("A"), b("B") {}
    };
    
    struct ZBar
    {
        XFoo b;
        XFoo a;
    
        ZBar() : a("A"), b("B") {}
    };
    
    
    int main()
    {
        YBar y;
        ZBar z;
        return 0;
    }
    

    将打印出来...

    A
    B
    B
    A
    

    【讨论】:

      【解决方案2】:

      这是一个初始化列表,但语法已关闭。试试:

      WFoo::WFoo(FILE* fa, FILE* fb) : A(fa), B(fb)
        {
        }    
      

      【讨论】:

        【解决方案3】:

        您要查找的语法是:

        WFoo::WFoo(FILE *fa, FILE *fb) : A(fa), B(fb) { ... }
        

        并且,除非 Foo 位于名为 Foo 的命名空间中,而 WFoo 不在:

        class WFoo {
           Foo A;
           Foo B;
        };
        

        【讨论】:

          【解决方案4】:

          如果您发布的代码是伪代码,那么WFoo 的定义没有任何问题

          另一方面,如果您发布的代码不是伪代码,而是您尝试编译和运行的实际代码,那么WFoo 有什么问题:

          1. 你想要Foo A; 而不是Foo::Foo A 除非Foo 位于名为Foo 的命名空间中(这会很糟糕)
          2. 没有转换构造函数声明。
          3. 您没有为初始化列表使用正确的语法。

          这就是你想要的:

          WFoo::WFoo(FILE* fa, FILE* fb)
          :  A(fa), B(fb)
          {
          }
          

          请注意,初始化列表位于构造函数的主体之前。

          【讨论】:

            猜你喜欢
            • 2015-04-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-07
            • 2012-05-23
            • 2023-03-17
            相关资源
            最近更新 更多