围绕C ++类的包装器

时间:2011-10-26 19:51:17

标签: c++ wrapper

假设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的定义有什么问题? 提前谢谢。

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您正在寻找的语法是:

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

并且,除非Foo位于名为Foo的名称空间中,WFoo不是:

class WFoo {
   Foo A;
   Foo B;
};

答案 3 :(得分:1)

如果你发布的代码是psudocode,那么WFoo的定义就会出现 nothing 错误。

另一方面,如果您发布的代码不是psudocode,而是您尝试编译的实际代码&amp;运行,然后这是WFoo

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

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

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