首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >流行的(c++)“错误:没有调用.的匹配函数",但是有一个踢

流行的(c++)“错误:没有调用.的匹配函数",但是有一个踢
EN

Stack Overflow用户
提问于 2014-03-13 01:47:27
回答 2查看 809关注 0票数 1

我在c++工作。

我的类animation.h如下:

代码语言:javascript
复制
class Animation
{
public:
    Animation(ofVec2f _startLoc, ofVec2f _endLoc, float _speed, float _accel);
    virtual ~Animation();
};

然后,在sceneMusic.h中,我有另一个调用animation类的类。

代码语言:javascript
复制
#include "animation.h"
class sceneMusic
{
    public:
        sceneMusic();
        virtual ~sceneMusic();
    private:
        Animation staveMotion;
};

sceneMusic.cpp

代码语言:javascript
复制
sceneMusic::sceneMusic()
{
    staveImg.loadImage("./sceneMusic/stave_white.png");

    staveMotion = Animation(ofVec2f(29, -staveImg.height()), \
                            ofVec2f(29, 249), 1, 0.1);
}

以上所示的错误如下(预期):

代码语言:javascript
复制
src/awards/sceneMusic.cpp|3|error: no matching function for call to ‘Animation::Animation()’|
src/awards/sceneMusic.cpp|5|note: candidates are:|
src/Animation.h|14|note: Animation::Animation(ofVec2f, ofVec2f, float, float)|
src/Animation.h|14|note:   candidate expects 4 arguments, 0 provided|

我读了很多建议我应该使用initializer lists并在sceneMusic.cpp中使用的线程

代码语言:javascript
复制
sceneMusic::sceneMusic()
    :Animation(ofVec2f(29, -staveImg.height()), \
               ofVec2f(29, 249), 1, 0.1)
{
    staveImg.loadImage("./sceneMusic/stave_white.png");
}

或者类似的东西。问题是,只有在构造函数执行之后,height of staveImg才会可用。

此外,类sceneMusic不继承类animation,因此我不确定上面的工作方式。如果我试图运行上面的代码,我将得到

代码语言:javascript
复制
src/awards/sceneMusic.cpp|4|error: type ‘Animation’ is not a direct base of ‘sceneMusic’|
src/awards/sceneMusic.cpp|4|error: ‘((sceneMusic*)this)->sceneMusic::staveImg.ofImage_<unsigned char>::height’ cannot be used as a function|
src/awards/sceneMusic.cpp|5|error: no matching function for call to ‘Animation::Animation()’|
src/awards/sceneMusic.cpp|5|note: candidates are:|
...

我做错什么了?

谢谢你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-13 01:50:51

好吧,你第二次尝试的问题是你需要这样做:

代码语言:javascript
复制
sceneMusic::sceneMusic()
    :staveMotion(ofVec2f(29, -staveImg.height()), \
               ofVec2f(29, 249), 1, 0.1)

在初始化程序列表中指定成员名称。只有在试图调用特定的超类构造函数时才指定类名。Animation不是sceneMusic的超级阶级.

以下“对动画的调用没有匹配函数::Animation()”发生的原因与初始化程序列表中没有任何内容的原因相同:staveMotion成员仍然试图使用Animation的默认构造函数(就像声明变量Animation a;时使用默认构造函数一样),但Animation没有默认构造函数。

纠正初始化程序列表中的错误将处理这两个错误。

顺便提一下,关于height()的第二个错误是:确保实际上有一个名为height()的成员函数。您没有显示代码,但该错误似乎表明您实际上有一个名为height的成员变量,而不是一个函数。

但是,以上仍然不能解决您必须首先调用loadImage的问题(感谢克里斯在评论中提醒我这一点)。

最简单的解决方案是恢复到第一次尝试,只需为Animation提供默认(无参数)构造函数。一旦声明了非默认构造函数,编译器就不再为您生成默认构造函数,您必须显式声明/定义Animation::Animation()来提供它。这样,staveMotion就可以用一些默认值来构造(而不必在初始化程序列表中构建),然后再分配给适当的值。

顺便说一下,第二个选项不需要首先创建临时默认Animation(或者更重要的是,不需要您实现一个可能破坏类不变量的默认构造函数),那就是让staveImg成为sceneMusic的一个成员字段,给它一个构造函数,该构造函数接受图像文件名并加载图像,然后在成员列表中的staveMotion面前声明它。为此,您不需要一个Animation默认构造函数,您可以初始化初始化程序列表中的所有内容:

代码语言:javascript
复制
sceneMusic :: sceneMusic () :
   staveImg("./sceneMusic/stave_white.png"),
   staveMotion(ofVec2f(29, -staveImg.height()), ofVec2f(29, 249), 1, 0.1)
{
}

该选项的一个变化是提前构造映像并将其作为参数传递给sceneMusic构造函数。这将不需要staveImg的新构造函数。

CantChooseUsernames在注释中提到的第三个选项是使staveMotion成为指针。您可以将其初始化为NULL,并在必要时构造new Animation(...),而不需要默认构造函数。如果你这样做了,当你做完之后,别忘了用delete。自动指针(如std::unique_ptr<Animation> )或其他智能指针(boost也有一些)可以使您更轻松。

票数 3
EN

Stack Overflow用户

发布于 2014-03-13 01:56:58

您需要默认构造函数类动画,因为您提供了参数构造函数,编译器不会为您生成参数构造函数。

代码语言:javascript
复制
Animation() {}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22367535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档