类构造函数

时间:2017-03-11 14:14:14

标签: c++ arduino

我收到以下错误,说明没有匹配的函数调用:

no matching function for call to 'Chord::Chord(const char [5], Note* [3], int, int)'

我对C ++很新,所以我可能会犯一个基本的错误。但我要做的是将注释放在堆上,将它们传递给构造函数,并将这些注释复制到Chord类中的私有属性。

我无法确定为何会发生这种情况。

主要 ...

Note *notes[] = {
    new Note(0, "C", "B#"),
    new Note(5, "E", "Fb"),
    new Note(8, "G", "G")
};

Chord chord = new Chord("CMaj", notes, 127, 1);

Chord.h

/*
 * Chord.h - Library for generating and playing chords
 * Created by James Jeffery <jameslovescode@gmail.com>, March 11, 2017.
 */
#ifndef Chord_h
#define Chord_h

#include "Arduino.h"
#include "Note.h"

class Chord
{
  public:
    Chord(String chord_name, Note notes[], int octave, int velocity);
    String getChordName();
    void play();
    void stop();
  private:
    Note notes[];
    String chord_name;
    int octave;
    int velocity;
};

#endif

1 个答案:

答案 0 :(得分:1)

构造函数声明为接受Note数组,但Note *notes[]声明了一个Note*数组。正如您在问题中所述,您希望在堆上分配Note,您应该调整您的类以在构造函数中获取Note *notes[]并在其成员中存储指针数组。

然而,这个解决方案可能(并且很可能会)出现所有权和解除分配问题(谁负责delete分配的对象以及何时发生?以及如何在这种情况下防止任何悬空指针?)。

IMO更好的方法是将Note自动存储在Chord类中,以便在“所有者”对象被销毁时销毁它们。为此,您需要更改的是您要传递给的初始数组:

Note notes[] = {
    Note(0, "C", "B#"),
    Note(5, "E", "Fb"),
    Note(8, "G", "G")
};

另一个选项(如果你真的希望动态分配Note)可能是你的Chord构造函数创建作为参数传递的Note的副本,可以使用new分配并在Chord的析构函数中销毁 - 这将解决第一个解决方案中提到的问题(但它会断开NoteChord的{​​{1}}通过构造函数传入的那些)

注意:您的问题还有另一个小的语法错误:Chord chord = new Chord("CMaj", notes, 127, 1);应为Chord* chord = new Chord("CMaj", notes, 127, 1);