Объявление статического объекта C ++ в файле .cpp - PullRequest
0 голосов
/ 23 июня 2018

Это моя структура кода:

Flashtraining.h

#ifndef Flashtraining_h
#define Flashtraining_h

#include "Enhanced_SPIFlash_Marzogh\\SPIFlash.h"

class Flashtraining
{ 
  static SPIFlash myflash; //Should it be declared outside private/public? Does it matter?
  public:
    bool start_new_training();
    bool stop_training();
    /*Some more methods*/
  private:
    bool _Check_or_Initialize();                    
};

Flashtraining.cpp

#include "Flashtraining.h"
SPIFlash Flashtraining::myflash;

bool Flashtraining::start_new_training(){
/*Do smth. with myflash object*/
}

bool Flashtraining::stop_training()
{
  /*Also do smth. with myflash object*/
}

main.cpp

#include "Flashtraining.h"

Flashtraining training; //Create object of class Flashtraining

training.start_new_training(); //Ignoring the main funcion, return values etc.

SPIFlash не имеет конструктора и имеет только нестатические элементы.Если вам также нужен этот файл, прокомментируйте, и я предоставлю его, но я уверен, что проблема не в этом.

Моя проблема: при выполнении этого кода я получаю

C:\Users\--\Flashtraining.cpp.o: In function `Flashtraining::_Check_or_Initialize()':

C:\Users\--\Flashtraining.cpp:265: undefined reference to `SPIFlash::begin(unsigned char, unsigned long)'

C:\Users\--\Flashtraining.cpp:268: undefined reference to `SPIFlash::getJEDECID()'

Примечание: _Check_or_Initialize() является одной из функций, объявленных в файле Flashtraining.cpp.Он объявлен так же, как и другие, которые я предоставил.

Функции в SPIFlash объявлены нестатичными и реализованы правильно.

Что я не понимаю: потому что я используюключевое слово static, я могу просто объявить объект (myflash типа SPIFlash) в файле заголовка (Flashtraining.h) без его инициализации, верно?Это также предотвращает переопределения.Из-за правила One определения в c ++ я инициализирую переменную Once в Flashraining.cpp, где она используется.Затем я должен иметь возможность использовать (.) Нотацию для доступа к нестатическим элементам (функциям, таким как myflash.start_training()) или нет?

Почему это дает мне неопределенную ссылку и как я могу это исправить?

Я посмотрел этот пост и думаю, что изменил свой код соответствующим образом, но он не работает.

Дополнительная информация: Это код .ino, которыйоснован на c ++.Все написанное на с ++ работает нормально.Использование -std=gnu++11.

1 Ответ

0 голосов
/ 23 июня 2018

Перейдите в настройки Arduino IDE и включите подробный флажок для компиляции.

Снова скомпилируйте код. Я думаю, что вы сами найдете здесь проблему, если нет, просмотрите выходные данные для файла с расширением .ino.cpp.

Вы получите абсолютное местоположение файла на выходе. Используйте абсолютный путь и откройте файл в текстовом редакторе. Однажды подтвердите, что функция

SPIFlash :: begin (unsigned char, unsigned long)

объявлено (если это так, я в растерянности). Если нет, то поищите в вашем коде ту же декларацию.

Ваше объявление, вероятно, будет окружено каким-то препроцессором #ifdef, #endif, который хранит ваш код неопределенным. Выясните, хотите ли вы препроцессор или нет, и отредактируйте его соответствующим образом.

Edit: В Arduino IDE компилируются только файлы cpp, которые находятся рядом с файлом ino или в библиотеках, заголовки которых были использованы. Поэтому, если в вашем файле ino.cpp нет объявлений функций, это может быть связано с тем, что файлы cpp находятся в какой-то другой папке или во вложенной папке рядом с файлом ino.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...