2015-07-19 2 views
2

Я довольно опытный разработчик .net, но новичок в Arduino и C/C++, и я пытаюсь создать свою первую библиотеку, которая является простым драйвером для 7-сегментного светодиодного дисплея. У меня много тупых ошибок компилятора, но в духе одной вещи за раз это первое. Я хочу добавить конструктор без параметров в мой класс, и когда я выполняю компиляцию библиотеки, но когда я пытаюсь использовать класс в эскизе, компилятор дает мне довольно тупой «запрос для члена setDigit» в «sevenSegmentLed», который имеет внеклассовой типа «SevenSegmentLed()»Parameterless constructor

Самый простой пример кода ниже:

#ifndef SevenSegmentLed_h 
#define SevenSegmentLed_h 
#include "Arduino.h" 

class SevenSegmentLed 
{ 
    public: 
    void setDigit(int digit); 
    SevenSegmentLed(); 
}; 

#endif 

#include "Arduino.h" 
#include "SevenSegmentLed.h" 

SevenSegmentLed::SevenSegmentLed() 
{ 

} 

void SevenSegmentLed::setDigit(int digit) 
{  

} 

#include "SevenSegmentLed.h" 
SevenSegmentLed sevenSegmentLed(); 

void setup() { 
    sevenSegmentLed.setDigit(4); 
} 

void loop() { 
    // put your main code here, to run repeatedly: 

} 

Однако если изменить конструктор подпись: SevenSegmentLed(int wtf); и создать его экземпляр таким образом: SevenSegmentLed sevenSegmentLed(1); компилирует просто отлично. Так как параметр говорит, WTF?

+0

Похож на случай наиболее неприятного разбора, что-то, что я могу добавить, не возникает в C#. 'SevenSegmentLed sevenSegmentLed();' это интерпретируется компилятором как объявление функции. – shuttle87

+0

Спасибо, я подумал, что это что-то в этом роде, и что мне с этим делать? –

+0

Btw, даже если у вас есть синтаксис справа, глобальные переменные * очень редко * (я почти хочу сказать никогда) хорошая идея в C++. –

ответ

3

Я считаю, что вопрос заключается в том, что это:

SevenSegmentLed sevenSegmentLed(); 

интерпретируется как объявление функции, а не инициализации. Обратите внимание, что у вас не может быть этой проблемы с C#, потому что у вас есть ключевое слово new для устранения неполадок, чтобы избежать этой конкретной проблемы.

Чтобы исправить это можно сделать 2 вещи:

Используйте C++ синтаксис равномерная инициализации (введен в новой C++ стандарт, чтобы избежать именно ваш вопрос):

SevenSegmentLed sevenSegmentLed{}; 

Или используйте следующий синтаксис:

SevenSegmentLed sevenSegmentLed; 

Главное преимущество равномерного синтаксиса состоит в том, что он является однородным. Так, например, если у вас есть конструктор, который принимает целое число, вы можете написать это так:

SevenSegmentLed sevenSegmentLed{1}; 

Вообще говоря равномерную синтаксис инициализации является предпочтительной, когда я писал C++ рекомендуемых в моей работе (в основном C# и PHP ребята) Я решил пойти с этим, потому что это самый ясный и недвусмысленный.

+0

Спасибо, что очень полезно, я доволен, что я не единственный человек, которого досаждают такие вещи. –

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