Скорее всего, это очень простой вопрос - извините за это.
Я написал интерфейс на C ++, который работает на движке C. Одна из функций C-engine имеет следующую подпись:
static int f(double t, double *y, double *ydot, void *data)
Смысл *data
- передавать пользовательские данные в ODE-решатель. Теперь в C я просто создаю struct
, инициализирую его с моими данными и передаю. В C ++ я хочу создать класс, содержащий пользовательские данные, и передать его, как я ранее передал struct
. Это может быть сделано, поскольку structs
являются classes
.
Однако, когда я пытаюсь это сделать, происходит следующее:
int.cpp:25: error: no matching function for call to ‘UserData::UserData()’
int.cpp:13: note: candidates are: UserData::UserData(double)
int.cpp:5: note: UserData::UserData(const UserData&)
int.cpp:28: error: ‘void*’ is not a pointer-to-object type
int.cpp:29: error: ‘void*’ is not a pointer-to-object type
Мои вопросы следующие:
- Что означает запись
void *data
?
- Почему жалуется, что у меня нет конструктора с соответствующей подписью?
Очевидно, я очень новичок, так что извините, если это очень очевидно, но я даже не знаю, какие термины использовать, чтобы погуглить проблему (в дополнение к поиску самой ошибки).
Спасибо!
Редактировать:
Прошу прощения за неопределенность предыдущего вопроса. Кроме того, я решил проблему, и это была очень глупая ошибка.
У меня был класс, содержащий параметры:
class Data{
// an interface to get parameters
};
и мне нужно было вызвать функцию C с подписью
static int f(double t, ...., void *user_data)
Я ошибочно сделал это:
static int f(double t, ...., void *user_data){
Data *data = (Data*) data; /* this is the stupid mistake */
}
Когда я хотел это сделать (теперь это работает):
static int f(double t, ...., void *user_data){
Data *data = (Data*) user_data; /* this is the correction */
}
Спасибо всем - и я ценю указание правильного значения void *data
.