类的包装器

Wrapper around a class C++

本文关键字:包装      更新时间:2023-10-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的定义有什么问题?

这没有任何意义…

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

这是一个初始化列表,但语法是错误的。试一试:

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

您要查找的语法是:

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

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

class WFoo {
   Foo A;
   Foo B;
};

如果你发布的代码是伪代码,那么没有错误的WFoo的定义。

另一方面,如果你发布的代码不是伪代码,而是你试图编译的实际代码&运行,然后这里是WFoo的问题:

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

这是你想要的:

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

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