繁体   English   中英

在类构造函数上没有匹配函数可用于调用错误

[英]no matching function for call error on class constructor

我收到以下错误消息,指出没有匹配的函数调用:

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 - 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

构造函数被声明为接受Note数组,但是Note *notes[]声明一个Note*数组。 正如您在问题中指出的那样,要在堆上分配Note ,应调整类以在构造函数中使用Note *notes[]并将指针数组存储在其成员中。

但是,此解决方案可能(并且很可能会)在所有权和释放上有问题(谁负责delete分配的对象以及它何时发生?以及在这种情况下如何防止任何悬空指针?)。

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

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

另一个选择(如果您真的想动态分配Note )可以是让Chord构造函数创建作为参数传递的Note的副本,该副本可以用new分配并在Chord的析构函数中销毁-这将解决第一个解决方案中提到的问题(但它将使ChordNote与通过构造函数传递的Note断开连接)

注意:您的问题中还存在另一个较小的语法错误: Chord chord = new Chord("CMaj", notes, 127, 1); 应该是Chord* chord = new Chord("CMaj", notes, 127, 1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM