我现在正在努力学习 Arduino 的 C++。我正在尝试编写一个简单的包装器,以便我可以在我的项目中使用多个 OLED。这是我到目前为止所得到的:
class Screen
{
private:
Adafruit_SSD1306 display;
unsigned long startTime = 0;
public :
Screen(){
Adafruit_SSD1306 this->display(128, 64, &Wire, -1);
}
void init(){
//Initialize the screen
this->display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
this->display.setTextSize(1);
this->display.setTextColor(SSD1306_WHITE);
this->display.clearDisplay();
this->output(60,30,":)");
this->display.display();
}
void output(int x, int y, String S){
this->display.setCursor(x, y);
this->display.print(S);
Display.display();
}
};
Screen screen();
void setup(){
screen.init();
}
void loop(){}
错误是:
In file included from D:\project\escape\puzzle box\source\puzzle_box_v6\Puzzle_box_v6.ino:12:0:
sketch\Screen.h: In constructor 'Screen::Screen()':
Screen.h:12:25: error: expected unqualified-id before 'this'
Adafruit_SSD1306 this->display(128, 64, &Wire, -1);
^~~~
sketch\Screen.h: In member function 'void Screen::output(int, int, String)':
Screen.h:27:7: error: 'Display' was not declared in this scope
Display.display();
^~~~~~~
sketch\Screen.h:27:7: note: suggested alternative: 'display'
Display.display();
^~~~~~~
display
D:\project\escape\puzzle box\source\puzzle_box_v6\Puzzle_box_v6.ino: In function 'void setup()':
Puzzle_box_v6:40:9: error: expected unqualified-id before '.' token
Screen.init();
^
exit status 1
expected unqualified-id before 'this'
我将不胜感激任何建议。也许我的整个方法都是错误的。 如果没有,我能否具体解释一下如何生成对象并将其分配给另一个类的属性。
最后,如果有人还在阅读……我不知道我需要声明什么参数数据类型来传递 init() 的内存位置值。目前它是“0x36”硬编码,我想通过参数传递它。如果有人可以就此事提供建议,我也将不胜感激。
答案 0 :(得分:3)
我不确定我是否理解您的意图,但我想您在编写代码时想初始化 display
成员
Adafruit_SSD1306 this->display(128, 64, &Wire, -1);
在构造函数中。问题是:这条线毫无意义。
要通过调用其构造函数来初始化成员,您应该使用成员初始化列表。 init
也应该是 Screen
的构造函数的一部分:
Screen() : display(123,64, &Wire, -1) {
//Initialize the screen
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.clearDisplay();
output(60,30,":)");
display.display();
}
您不需要为成员添加 this->
前缀。不确定 &Wire
是什么,因为它不是错误消息的一部分,我想它是在您没有发布的代码中声明的。
其他错误是 'Display' was not declared in this scope
,因为没有 Display
。如果要调用 display
成员的 Adafruit_SSD1306
方法,必须注意大小写:display.display();
Screen screen();
是所谓的最烦人的解析。它声明了一个函数。如果你想声明一个 Screen
类型的对象,请改写:
Screen screen; // or ..
Screen screen{}; // or...
auto screen = Screen();
最后一个错误不在您发布的代码中。当您拥有正确的 Screen.init()
时,它会抱怨 screen.init();
。不过,如上所述,初始化可能应该是构造 Screen
的一部分,您可以删除该方法和该调用。
答案 1 :(得分:2)
这一行:
Adafruit_SSD1306 this->display(128, 64, &Wire, -1);
不是有效的 C++。如果要初始化 display
对象中的 Screen
成员,可以执行以下操作:
this->display = Adafruit_SSD1306 (128, 64, &Wire, -1);
免责声明:我不知道 Adafruit_SSD1306
构造函数期望什么参数,因此上述内容可能需要稍作调整。
或者(更好),您可以在 display
的构造函数的初始化列表中初始化您的 Screen
成员,如@largest_prime 的回答中所述。如果您不想使用所有常量初始化 display
,则在任何一种情况下都将任何必要的参数传递给 Screen 的构造函数。
此外,您不需要在所有地方都写上 this->
。这是编译器假定的。