用C ++初始化C结构

时间:2012-01-20 14:22:55

标签: c++ c dll struct

我正在创建一堆C结构,所以我可以封装要通过dll c接口传递的数据。结构体有很多成员,我希望它们具有默认值,这样就可以只用少数成员创建它们。

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

4 个答案:

答案 0 :(得分:3)

struct Foo {
    static Foo make_default ();
};

工厂过度杀伤。当您想要创建给定接口的实例时,可以使用它,但在创建的站点上并不是静态地知道实现的运行时类型。

答案 1 :(得分:3)

C-Structs仍然可以具有成员函数。但是,如果您开始使用虚函数,则会出现问题,因为这需要在结构内存中的某个位置使用虚拟表。普通成员函数(例如构造函数)实际上不向结构添加任何大小。然后,您可以毫无问题地将结构传递给DLL。

答案 2 :(得分:1)

我会使用构造函数类:

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));

答案 3 :(得分:1)

我有一个简单的想法,这是如何:

像通常那样制作结构,并创建一个初始化它的简单函数:

struct Foo{...};

void Default(Foo &obj) {
    // ... do the initialization here
}

如果您有多个结构,C ++中允许您重载该函数,因此您可以使用名为&#39; default&#39;的多个函数,每个函数初始化自己的类型,例如:

struct Foo { //... };
struct Bar { //... };

void Default(Foo &obj) {...}
void Default(Bar &obj) {...}

C ++编译器将根据参数知道何时调用第一个或第二个重载。 &amp;使obj引用您给它的任何参数,因此对obj所做的任何更改都将反映到您作为参数放置的变量。

编辑: 我也知道如何指定一些参数,你可以使用默认参数。这是它的工作原理:

例如你有以下功能;您可以为这样的参数指定默认值:

void Default (Foo &obj, int number_of_something = 0, int some_other_param = 10)
{ ... }