在类构造函数上没有匹配函数来呼叫错误

no matching function for call error on class constructor

本文关键字:函数 呼叫 错误 构造函数      更新时间:2023-10-16

我会收到以下错误,说明没有匹配函数呼叫:

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

我是C 的新手,因此我可能会犯一个基本错误。但是我要做的是在堆上写笔记,将它们传递给构造函数,并将这些笔记复制到Chord类中的私有财产中。

我似乎无法指出为什么会发生这种情况。

内部 main ...

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

构造器被声明接受Note的数组,但Note *notes[]声明了Note*的数组。正如您在问题中所说的那样,您想在堆上分配Note s,您应该调整课程以将Note *notes[]在构造函数中吸入并存储一系列指针。

但是,该解决方案可以(很可能)有所有权和交易的问题(谁负责delete分配的对象,什么时候发生?/p>

IMO更好的方法是将Note s存储在Chord类中的自动持续时间中,以便当"所有者"对象被破坏时将被销毁。为此,您需要更改的所有内容将是您要传递的初始数组:

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

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

注意:您的问题中还遇到了另一个次要语法错误:Chord chord = new Chord("CMaj", notes, 127, 1);应该是Chord* chord = new Chord("CMaj", notes, 127, 1);