Инициализировать C-структуры в C ++ - PullRequest
4 голосов
/ 20 января 2012

Я создаю кучу структур C, чтобы я мог инкапсулировать данные для передачи через интерфейс dll c.Структуры имеют много членов, и я хочу, чтобы у них были значения по умолчанию, чтобы их можно было создать, указав только несколько элементов.

Насколько я понимаю, структуры должны оставаться в стиле c, поэтому можно:не содержит конструкторов.Каков наилучший способ их создания?Я думал о фабрике?

Ответы [ 4 ]

3 голосов
/ 20 января 2012

C-Structs все еще может иметь функции-члены.Проблемы, однако, возникнут, если вы начнете использовать виртуальные функции, так как для этого потребуется виртуальная таблица где-то в памяти структуры.Обычные функции-члены (такие как конструктор) фактически не добавляют никакого размера к структуре.Затем вы можете без проблем передать структуру в DLL.

3 голосов
/ 20 января 2012
struct Foo {
    static Foo make_default ();
};

Фабрика излишня. Вы используете его, когда хотите создать экземпляры данного интерфейса, но тип среды выполнения реализации статически не известен на сайте создания.

1 голос
/ 20 января 2012

У меня есть простая идея, вот как:

Создайте структуру, как обычно, и создайте простую функцию, которая ее инициализирует:

struct Foo{...};

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

Если у вас есть несколько структур, вам разрешено в C ++ перегружать функцию, поэтому вы можете иметь много функций с именем «default», каждая из которых инициализирует свой собственный тип, например:

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

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

Компилятор C ++ будет знать, когда вызывать первую или вторую перегрузку, основываясь на параметре. & Делает ссылку на obj на любой заданный вами параметр, поэтому любые изменения, внесенные в obj, будут отражены в переменной, которую вы указали в качестве параметра.

Edit: У меня также есть идея, как указать некоторые параметры, вы можете сделать это с помощью параметров по умолчанию. Вот как это работает:

Например, вы следующая функция; Вы можете указать значения по умолчанию для таких параметров:

void Default (Foo &obj, int number_of_something = 0, int some_other_param = 10)
{ ... }
1 голос
/ 20 января 2012

Я бы использовал класс конструктора:

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