gpt4 book ai didi

c++ - 类构造函数上的调用错误没有匹配函数

转载 作者:行者123 更新时间:2023-11-28 05:15:38 26 4
gpt4 key购买 nike

我收到以下错误,指出没有匹配的函数调用:

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

我是 C++ 的新手,所以我可能犯了一个低级错误。但我想做的是将音符放在堆上,将它们传递给构造函数并将这些音符复制到 Chord 类中的私有(private)属性。

我似乎无法确定为什么会这样。

ma​​in 内 ...

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);

和弦.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在堆上,你应该调整你的类(class)采取Note *notes[]在构造函数中并在其成员中存储一个指针数组。

但是,此解决方案可能(而且很可能会)在所有权和释放方面存在问题(谁负责 delete 分配的对象以及何时发生?在这种情况下如何防止任何悬空指针?) .

IMO 更好的方法是存储 Note s 在 Chord 内自动持续类,以便当“所有者”对象被销毁时它们将被销毁。为此,您需要更改的只是您要传递给的初始数组:

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

另一个选项(如果你真的想让 Note 被动态分配)可能是有你的 Chord构造函数创建 Note 的拷贝s 作为参数传递,可以用 new 分配并在 Chord 的析构函数中销毁- 这将解决第一个解决方案中提到的问题(但它会将 Note 中的 Chord 与通过构造函数传入的那些断开连接)

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

关于c++ - 类构造函数上的调用错误没有匹配函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42736250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com