2017-03-11 57 views
0

我收到以下錯誤,說明沒有匹配的函數調用:呼叫錯誤沒有匹配的功能在類的構造函數

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 <[email protected]>, 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 
+0

啊。我認爲這將是一個簡單的問題。請作爲回答,我會接受。 – BugHunterUK

+0

我原來的建議實際上是錯誤的,我試着在我的答案中解釋一下 - 如果有什麼不清楚的地方,請留言 – UnholySheep

+2

看起來你是一個正在恢復的Java程序員。 C++程序員儘可能避免使用「new」這個詞。 (和'筆記[];'成員是無效的C++。) – molbdnilo

回答

1

構造函數聲明爲接受的Note數組,但Note *notes[]聲明的Note*陣列。正如你在你的問題中所說的,你想在堆上分配Note,你應該調整你的類在構造函數中取Note *notes[],並在其成員中存儲一個指針數組。

但是,這種解決方案可能(也很可能會)擁有和解除分配問題(誰負責分配的對象以及何時發生?以及如何防止在這種情況下發生任何懸掛指針?)。

IMO更好的方法是將Notes存儲在Chord類中的自動持續時間內,這樣當「所有者」對象被破壞時它們將被銷燬。對於這一切,你只需要修改將要傳遞到初始數組:

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

另一種選擇(如果你真的想擁有Note s內動態分配)可能是有你的Chord構造創建作爲參數傳遞的Note的副本,該參數可以與new一起分配並在Chord的析構函數中銷燬 - 這將解決第一個解決方案中提到的問題(但它將斷開Chord中的與傳遞的通過構造函數)

注意:你所以在你的問題中有另一個小的語法錯誤:Chord chord = new Chord("CMaj", notes, 127, 1);應該是Chord* chord = new Chord("CMaj", notes, 127, 1);

相關問題