C++ 在C+中初始化C-structs+;
我正在创建一组C结构,以便封装要通过dll C接口传递的数据。结构有很多成员,我希望它们有默认值,这样就可以只指定几个成员来创建它们 据我所知,结构需要保持c风格,因此不能包含构造函数。创建它们的最佳方式是什么?我在想一个工厂C++ 在C+中初始化C-structs+;,c++,c,dll,struct,C++,C,Dll,Struct,我正在创建一组C结构,以便封装要通过dll C接口传递的数据。结构有很多成员,我希望它们有默认值,这样就可以只指定几个成员来创建它们 据我所知,结构需要保持c风格,因此不能包含构造函数。创建它们的最佳方式是什么?我在想一个工厂 struct Foo { static Foo make_default (); }; 工厂是多余的。当您想要创建给定接口的实例,但在创建站点上实现的运行时类型静态未知时,可以使用它。我将使用构造函数类: struct Foo { ... }; class Ma
struct Foo {
static Foo make_default ();
};
工厂是多余的。当您想要创建给定接口的实例,但在创建站点上实现的运行时类型静态未知时,可以使用它。我将使用构造函数类:
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;
}
};
我有一个简单的想法,如下所示: 像平常一样创建结构,并创建一个简单的函数来初始化它:
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结构仍然可以有成员函数。但是,如果开始使用虚拟函数,则会出现问题,因为这需要在结构内存中的某个位置创建一个虚拟表。普通成员函数(如构造函数)实际上不会向结构添加任何大小。然后,您可以毫无问题地将结构传递给DLL。这肯定是工厂吗?尽管是函数,而不是类型?@dangerousdave:您想要的是一个,并且这些成员可以有
静态成员。@spraff:这是一个抽象工厂。没有必要有一个非抽象的、未封装的“工厂”。这只是添加了一些毫无意义的行话。@Lightness:我认为“工厂”这个词的用法并不一致。通常,它和您一样被用来表示创建对象的任何函数或对象。有时它专门用来指工厂方法模式或抽象工厂模式(我认为两者都有一个工厂接口,带有具体的实现,尽管我没有GoF手册)。将“创造事物的任何东西”定义应用于按值返回的问题在于,它使std::sin
成为一个工厂-它需要double
并返回一个新创建的double
。这是一个有效的解决方案,但如果你问我,这有点过分。用多个语句构建一个对象有什么错?链接在使用时并不省力,它只是在其他地方添加了冗余代码。@spraff,没什么错,但我个人更喜欢面向表达式的接口,不需要包含中间值的变量。我有时使用这种方法。您甚至可以添加其他参数并使用重载来创建各种构造函数。默认参数究竟是如何“新”的?它们在标准C++中一直是有效的,我想在相当长的时间里,甚至在那之前,你是对的,我最近了解了它们,并且我假设它们是新的。我做了一些研究,现在我知道:D@dangerousdave:如果它不工作,那么我有很多代码会被破坏。你能提供更多关于你的“实验”的信息吗?对于一个没有构造函数的结构和一个有构造函数的结构,会得到不同的“sizeof”结果吗?在C++11中,这很好,因为它仍然是一个标准布局类(可以有构造函数和其他非虚拟成员函数)。在C++03中,这在实践中可能是好的,但不能保证添加构造函数将保持布局。@Mike Seymour:很公平,以前从未听说过(或有过更多经验)。你能告诉我规范中提到这个问题的特定部分吗?C++11,9/6定义了标准布局类。我手头没有C++03的副本,但从内存来看,它的“类”一章,可能是第9章,没有定义标准布局的概念,只有POD;“带构造函数的类不是POD。@迈克·西摩:干杯。我对这件事感到震惊,tbh,我不知道。我想我很幸运,我从来没有遇到过一个编译器在这样的事情上会有奇怪的表现:D
void Default (Foo &obj, int number_of_something = 0, int some_other_param = 10)
{ ... }