Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中初始化C-structs+;_C++_C_Dll_Struct - Fatal编程技术网

C++ 在C+中初始化C-structs+;

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

我正在创建一组C结构,以便封装要通过dll C接口传递的数据。结构有很多成员,我希望它们有默认值,这样就可以只指定几个成员来创建它们

据我所知,结构需要保持c风格,因此不能包含构造函数。创建它们的最佳方式是什么?我在想一个工厂

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)
{ ... }