在C++中初始化C指令
Initialise C-structs in C++
我正在创建一堆C结构,这样我就可以封装要通过dll-C接口传递的数据。结构有很多成员,我希望它们有默认值,这样就可以只指定几个成员来创建它们。
据我所知,结构需要保持c样式,因此不能包含构造函数。创造它们的最佳方式是什么?我在想一个工厂?
struct Foo {
static Foo make_default ();
};
一家工厂太夸张了。当您想要创建给定接口的实例时,可以使用它,但在创建时,实现的运行时类型并不是静态已知的。
C结构仍然可以具有成员函数。然而,如果您开始使用虚拟函数,则会出现问题,因为这需要在结构内存中的某个位置使用虚拟表。普通成员函数(如构造函数)实际上不会向结构添加任何大小。然后,您可以毫无问题地将结构传递到DLL。
我会使用一个构造函数类:
struct Foo { ... };
class MakeFoo
{
Foo x;
public:
MakeFoo(<Required-Members>)
{
<Initalize Required Members in x>
<Initalize Members with default values in x>
}
MakeFoo& optionalMember1(T v)
{
x.optionalMember1 = v;
}
// .. for the rest option members;
operator Foo() const
{
return x;
}
};
这允许在表达式中任意设置结构的成员:
processFoo(MakeFoo(1,2,3).optionalMember3(5));
我有一个简单的想法,下面是如何:
像往常一样制作结构,并创建一个简单的函数来初始化它:
struct Foo{...};
void Default(Foo &obj) {
// ... do the initialization here
}
如果你有多个结构,你可以在C++中重载函数,所以你可以有很多被称为"默认"的函数,每个函数都初始化自己的类型,例如:
struct Foo { //... };
struct Bar { //... };
void Default(Foo &obj) {...}
void Default(Bar &obj) {...}
C++编译器将知道何时根据参数调用第一个或第二个重载。&使obj引用您给它的任何参数,因此对obj所做的任何更改都将反映到您作为参数放入的变量中。
编辑:我还有一个关于如何指定一些参数的想法,你可以通过使用默认参数来完成。这就是它的工作原理:
例如你有以下功能;您可以为以下参数指定默认值:
void Default (Foo &obj, int number_of_something = 0, int some_other_param = 10)
{ ... }
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 如何在 OpenMP 线程专用指令中使用对象的直接初始化
- 在C++中初始化C指令