类的包装器
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
的问题:
- 您想要
Foo A;
而不是Foo::Foo A
,除非Foo
在一个名为Foo
的命名空间中(这将是坏的) 没有转换构造函数声明。 - 你没有为初始化列表使用正确的语法。
这是你想要的:
WFoo::WFoo(FILE* fa, FILE* fb)
: A(fa), B(fb)
{
}
注意,初始化列表位于构造函数体之前。
相关文章:
- 如何在c++17中制作一个模板包装器/装饰器
- std::vector的包装器,使数组的结构看起来像结构的数组
- 如何在c++迭代器类型中包装std::chrono
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 用pybind11包装C++抽象类时出错
- 为左值和右值的包装器实现C++范围
- C结构,其指针将被包装在unique_ptr中
- 如何包装第三方DLL在R中使用
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 将 N-arg 函数包装到另一个函数中
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 包装一个对象并假装它是一个 int
- 使用 Python Extension API 包装复杂C++类
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 包装C++类时不完整的类型 GLFWwindow
- 将函数包装器转换为 std::function
- C++函数包装器来捕获某些信号
- 创建包装升压适配器的自定义范围类
- 如何包装(撰写)增强 hana 地图并访问括号运算符(运算符 [])?
- 使用运算符*重载包装矩阵乘法