2017-03-11 56 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);

相关问题