[英]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
的析構函數中銷毀-這將解決第一個解決方案中提到的問題(但它將使Chord
的Note
與通過構造函數傳遞的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.