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