C++ 从我的类调用对象构造函数

C++ 从我的类调用对象构造函数,c++,class,arduino,C++,Class,Arduino,我在理解如何将“常规”代码转换为“面向对象”代码时遇到了一些困难 我的代码是针对Arduino的,但是这个问题已经足够一般化了,因此没有任何Arduino特定的细节与这个问题相关 在我的“常规”代码中,我只需导入一个库,调用带有一些参数的构造函数来创建对象,然后调用begin方法 #include <Adafruit_NeoPixel.h> #define NPIXELS 10 #define PIN 3 #define FREQ 10000 void main() { A

我在理解如何将“常规”代码转换为“面向对象”代码时遇到了一些困难

我的代码是针对Arduino的,但是这个问题已经足够一般化了,因此没有任何Arduino特定的细节与这个问题相关

在我的“常规”代码中,我只需导入一个库,调用带有一些参数的构造函数来创建对象,然后调用begin方法

#include <Adafruit_NeoPixel.h>
#define NPIXELS 10
#define PIN 3
#define FREQ 10000

void main() {
    Adafruit_NeoPixel pixels(NPIXELS, PIN, FREQ);
    pixels.begin();
}
所以,我的问题是: 如何在类中创建对象像素并调用正确的构造函数(具有3个参数的构造函数:NUMPIXELS、PIN、FREQ)初始化它


感谢从其他构造函数调用构造函数使用以下语法:

MyDevice::MyDevice():像素(像素、PIN、频率)
{
//MyDevice的构造函数
}

<>代码>请仔细阅读你的C++书籍。查找“”部分

MyDevice::MyDevice():像素{NPIXELS,PIN,FREQ}
{
}
如果您使用的是C++11或更高版本,则更喜欢大括号初始化而不是圆括号初始化

另一个好的做法是不要使用宏(尽量避免使用宏)。因此,要定义常数,请使用
const
constepr

constexpr int NPIXELS=10;
constexpr int PIN=3;
constexpr int FREQ=10000;

如果您将代码编译为C++11,那么您的第一种方法将真正起作用!在MyDevice::MyDevice中尝试1和2尝试使用
像素
作为函数,而最后一个尝试创建一个根本没有连接到
像素
成员的局部变量。是的,但这都不是我想要的。前两个选项让编译器抱怨,第三个选项不是我想要的,因为我将使用构造函数之外的像素。答案(编辑后)是正确的。支持什么频率?在github,似乎只支持
400 KHz
800 KHz
,如果未定义
NEO_KHZ400
,则第三个参数(
FREQ
)被定义为
uint8_t
——在这种情况下,
FREQ
将无法工作。您能否详细说明?如果我必须调用多个构造函数呢?(例如:2 Adafruit_Neopix)这是错误的。您可能会想到构造函数委托,但它们是不同的类型。这不能编译编辑:问题已由Botje解决。@SembeiNorimaki这里有一个打字错误。它应该是
MyDevice():像素(NPIXELS,PIN,FREQ){/…
。有关更多信息,请参阅。使用正确的成员名称编辑了答案。如果需要调用2构造函数jsut,请在它们之间添加
Class::Class():class1(),class2(){}
,感谢您的建议
// MyDevice.h 

class MyDevice {
public:
    MyDevice();  // constructor
private:
    // this fails, I cannot call the constructor with parameters here
    // Adafruit_NeoPixel pixels(NPIXELS, PIN, FREQ);

    // this compiles, so I just define pixels as an Adafruit_Neopixel object
    Adafruit_NeoPixel pixels;
}


// MyDevice.cpp
#include "MyDevice.h"

MyDevice::MyDevice() {  // constructor
   // here I need to call the constructor of Adafruit_NeoPixel 
   // with the parameters NPIXELS, PIN and FREQ
   
   // This fails
   // no match for call to '(Adafruit_NeoPixel) (int, int, int)
   this->pixels(NPIXELS, PIN, FREQ);

   // This also fails
   // no match for call to '(Adafruit_NeoPixel) (int, int, int)
   pixels(NPIXELS, PIN, FREQ);

   // This compiles, but I am not sure if here I am using the
   //   pixels object defined in the .h file or I am just 
   // creating a new object inside the constructor.
   // If I remove the pixels definition from the h file it 
   // still compiles, which is suspicious
   Adafruit_NeoPixel pixels(NPIXELS, PIN, FREQ);
}