【发布时间】:2012-01-20 14:22:54
【问题描述】:
我正在创建一堆 C 结构,因此我可以封装要通过 dll c 接口传递的数据。结构有很多成员,我希望它们有默认值,这样就可以只指定几个成员来创建它们。
据我了解,结构需要保持 c 风格,因此不能包含构造函数。创建它们的最佳方法是什么?我在想工厂?
【问题讨论】:
我正在创建一堆 C 结构,因此我可以封装要通过 dll c 接口传递的数据。结构有很多成员,我希望它们有默认值,这样就可以只指定几个成员来创建它们。
据我了解,结构需要保持 c 风格,因此不能包含构造函数。创建它们的最佳方法是什么?我在想工厂?
【问题讨论】:
struct Foo {
static Foo make_default ();
};
工厂是矫枉过正。当您想要创建给定接口的实例时使用它,但实现的运行时类型在创建站点上不是静态已知的。
【讨论】:
static 成员。
std::sin 成为工厂——它需要double 并返回一个新创建的double。所以这有点毫无意义。
C-Structs 仍然可以有成员函数。但是,如果您开始使用虚函数,就会出现问题,因为这需要在结构内存的某个位置创建一个虚表。普通成员函数(例如构造函数)实际上不会向结构添加任何大小。然后,您可以毫无问题地将结构传递给 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)
{ ... }
【讨论】: