Объявление статического объекта С++ в файле.cpp

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

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++, я инициализирую переменную один раз в Flashraining.cpp, где она используется. Затем я должен использовать (.) Нотацию для доступа к myflash.start_training() членам (функции, например myflash.start_training()), или нет?

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

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

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

1 ответ

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

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

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

SPIFlash :: begin (unsigned char, unsigned long)

(если это так, я нахожусь в убытке). Если нет, то выполните поиск по вашему коду для той же декларации.

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

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

licensed under cc by-sa 3.0 with attribution.