2010-09-10 4 views
6

У меня есть структура:Как назначить значение по умолчанию для структуры в C++?

typedef struct { 
    double x,y,z; 
} XYZ; 

Я хочу, чтобы определить функцию, как это:

double CalcDisparity(XYZ objposition, 
        XYZ eyeposition, 
        double InterOccularDistance = 65.0) 

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

+0

Этот прямой C или C++? – diverscuba23

+3

@drknexus, структура на C++ точно такая же, как класс, за исключением того, что ее члены являются общедоступными по умолчанию, а члены класса по умолчанию являются закрытыми. Вот и все. Структуры могут иметь конструкторы, деструкторы, методы, в основном все, что имеет класс. Теперь, если вы говорите о C, тогда они снова разные, поэтому вам нужно четко указать, на каком языке вы говорите. – Glen

+0

Это C++, поэтому я отредактировал вопрос и теги, чтобы удалить C из вопроса. –

ответ

11

Это

struct XYZ{ 
    XYZ(double _x, double _y, double _z) : x(_x), y(_y),z(_z){} 
    XYZ() : x(0.0), y(42.0), z(0.0){} 

    double x, y, z; 
}; 

, так что теперь у меня есть конструктор по умолчанию. Тогда вы называете это так:

double CalcDisparity(XYZ objposition = XYZ(), 
         XYZ eyeposition = XYZ(), 
         double interOccularDistance = 65.0) 

Но есть одна маленькая хитрость: вы не можете сделать значение по умолчанию для 1-го и 3-го только аргументы. Еще одна вещь: C - это язык, C++ - другой язык.

+0

Вы можете, если вы определяете дополнительные конструкторы, например: 'struct XYZ {XYZ (double _x, double _z): x (_x), y (42.0), z (_z)}; double CalcDisparity (XYZ objposition = XYZ(), XYZ eyeposition = XYZ (1.0, 2.0), double interOccularDistance = 65.0); ' –

1
  1. Вы можете написать заводскую функцию для создания объектов XYZ и вызвать функцию как значение по умолчанию.

  2. Вы можете сделать NULL значением по умолчанию, а затем проверить функцию, если аргумент равен NULL, создавая XYZ по умолчанию, если это так.

  3. Создайте глобальный объект XYZ и назначьте его по умолчанию.

  4. Если вы не против использования C++ вместо чистого C, сделайте XYZ классом с конструктором.

Это все способы компиляции и работы, но некоторые из них могут не быть хорошими методами кодирования.

+0

, если он использует C++, тогда он может оставить его как struct, но дать ему конструктор – Glen

2

В аргументах C аргументы функции не могут иметь значения по умолчанию (не знаю о C++).

Что вы можете сделать, в C, передает (как-то) недопустимое значение, проверяет это недопустимое значение и вместо него использует другое.

int foo(int n) { 
    if (n == -1) { /* -1 is invalid */ 
    n = 42;  /* use 42 instead */ 
    } 
    /* ... */ 
} 
+0

Когда этот ответ был задан, вопрос был помечен как «C»; тэг с тех пор был удален, потому что C не поддерживает значения по умолчанию для аргументов. –

+0

C++ поддерживает значения по умолчанию. – andand

-1

Вы можете комбинировать последнее решение с частью моего решения. Вы реализуете счетчик экземпляров. Если этот счетчик равен 0, вы инициализируете значение. Но счетчик никогда не достигает ничего, кроме 0 ...

Возможно, это помогает.

Смежные вопросы