Неправильное приведение типов в конструкторе класса

#c #class #casting

#c #класс #Кастинг

Вопрос:

Я новичок в C , и у меня проблема с классами.

Я получил этот прототип

 class MMA7455 : public Accel
{
public:
    MMA7455(uint8_t);
    uint8_t accel_get_data(acceleration_t*);
private:
    uint8_t accel_data_ready(void);
};
  

и я хочу создать его экземпляр

 MMA7455 accel = MMA7455(0x21);
  

но появляется следующее сообщение

 In function `global constructors keyed to accel':
sensors.cpp:(.text 0x8): undefined reference to `MMA7455::MMA7455(unsigned char)'
  

Почему он ищет аргумент ‘unsigned char’? То же сообщение, даже если я пытаюсь неявно привести тип константы

 MMA7455 accel = MMA7455((uint8_t)0x21);
  

Комментарии:

1. Верно, проблема была в неправильных настройках компоновщика

Ответ №1:

Вероятно, вы не связали свой cpp-файл, содержащий определение конструктора. «uint8_t» является определением типа для ‘unsigned char».

Ответ №2:

Вам нужно определить MMA7455::MMA7455(uint8_t) где-нибудь в вашей программе, т.Е. добавить {} -body после определения в прототипе (или, возможно, вы просто забыли скомпилировать и связать cpp-файл, содержащий определения для MMA7455 .

Он ищет, unsigned char потому что uint8_t в вашей системе есть typedef for unsigned char .

Комментарии:

1. Я определил это как MMA7455::MMA7455(uint8_t i2cAddress) { this->m_Address = i2cAddress; }

Ответ №3:

uint8_t является определением типа для unsigned char на вашей платформе. Ошибка является ошибкой компоновщика, поскольку вы не предоставили реализацию для своего конструктора и не связана с аргументом, являющимся unsigned char или нет.

Комментарии:

1. Я определил это как MMA7455::MMA7455(uint8_t i2cAddress) { this->m_Address = i2cAddress; }

2. @marvin: Вы правильно связываете этот файл?