调用'spriteSheet::spriteSheet()'没有匹配函数

no matching function for call to 'spriteSheet::spriteSheet()'

本文关键字:spriteSheet 函数 调用      更新时间:2023-10-16

我最近开始学习C++,我已经在这个错误上呆了一段时间了。寻找类似的问题并没有给我一个答案。

部分主.cpp:

#include <SDL.h>
#include <SDL_image.h>
#include <iostream>
#include <string>
#include "spritesheet.h"
using namespace std;
spriteSheet charimage("../img/char.png");
spriteSheet bgimage("../img/bg.png");
class playerSprite
{
    public:
        playerSprite(int xpos, int ypos, spriteSheet sheet);
        int pos[2]; // player postition
        spriteSheet image;
};
playerSprite::playerSprite(int xpos, int ypos, spriteSheet sheet)
{
    pos[0] = xpos;
    pos[1] = ypos;
    image = sheet;
}
playerSprite player(0, 0, charimage);

精灵表.h:

#ifndef LTEXTURE_H
#define LTEXTURE_H
using namespace std;
extern SDL_Renderer* screen;
class spriteSheet //Texture wrapper for all game objects
{
    SDL_Texture* sheet;
    SDL_Rect ssize;
    public:
        spriteSheet(string path);
        ~spriteSheet();
        void setClip(int x = 0, int y = 0, int w = 0, int h = 0);
        void render(int x = 0, int y = 0);
        void free();
        SDL_Rect sclip;
};
#endif // LTEXTURE_H

精灵表的一部分.cpp:

#include <SDL.h>
#include <SDL_image.h>
#include <iostream>
#include <string>
#include "spritesheet.h"
using namespace std;
spriteSheet::spriteSheet(string path)
{
    SDL_Texture* newTexture = NULL;
    SDL_Surface* loadedSurface = IMG_Load(path.c_str());
    if(loadedSurface == NULL)
    {
        cout << IMG_GetError() << endl;
    }
    else
    {
        newTexture = SDL_CreateTextureFromSurface(screen, loadedSurface);
        if(newTexture == NULL)
        {
            cout << SDL_GetError() << endl;
        }
        else
        {
            ssize.w, sclip.w = loadedSurface->w;
            ssize.h, sclip.h = loadedSurface->h;
        }
        SDL_FreeSurface(loadedSurface);
    }
    sheet = newTexture;
}

当我构造我的玩家精灵对象时,我想为它传入一个精灵表对象。我已经通过具有playerSprite::setSheet((和spriteSheet::setImage((等函数来编译此代码,但我无法使其与构造函数一起使用。每次我尝试编译时都会收到此错误:

C:UsersPlatinoDocumentsC++Dragoroguemain.cpp  In constructor 'playerSprite::playerSprite(int, int, spriteSheet)':
20  65  C:UsersPlatinoDocumentsC++Dragoroguemain.cpp  [Error] no matching function for call to 'spriteSheet::spriteSheet()'
20  65  C:UsersPlatinoDocumentsC++Dragoroguemain.cpp  [Note] candidates are:
5   0   C:UsersPlatinoDocumentsC++Dragoroguemain.cpp  In file included from main.cpp
13  3   C:UsersPlatinoDocumentsC++Dragoroguespritesheet.h [Note] spriteSheet::spriteSheet(std::string)
13  3   C:UsersPlatinoDocumentsC++Dragoroguespritesheet.h [Note] candidate expects 1 argument, 0 provided
7   7   C:UsersPlatinoDocumentsC++Dragoroguespritesheet.h [Note] spriteSheet::spriteSheet(const spriteSheet&)
7   7   C:UsersPlatinoDocumentsC++Dragoroguespritesheet.h [Note] candidate expects 1 argument, 0 provided

编辑:

LogicStuff 建议的方法会迫使我在每次构造新的 playerSprite 对象时初始化一个新的 SpriteSheet 对象。我想创建一个单独的精灵表对象,并让所有玩家精灵对象使用它。

由于

您的spriteSheet对象没有默认构造函数,因此问题是您在playerSprite类中有一个需要构造一个参数的spriteSheet成员。 该成员是image

class spriteSheet 
{
        spriteSheet(string path);  // <-- This is your constructor
};
class playerSprite
{
    public:
        playerSprite(int xpos, int ypos, spriteSheet sheet);  
        spriteSheet image;  // <-- This member has to be initialized on construction.
};

在构造playerSprite时,必须初始化spriteSheet成员。 初始化image成员的唯一方法是在成员初始化列表中使用一个参数构造它:

playerSprite::playerSprite(int xpos, int ypos, spriteSheet sheet) :
                           image("somestring") 
{
  //...
}

注意 -- 构造函数主体中的代码({ }之间(不是初始化的。 这是任务 - 一个很大的区别。 若要初始化,必须使用成员初始化列表。

此外,您应该通过 const 引用传递spriteSheet,而不是通过值传递:

playerSprite::playerSprite(int xpos, int ypos, const spriteSheet& sheet) :
                           image("somestring") 
{
   image = sheet;  // now we can assign.
}

进入构造函数后,您可以对成员进行赋值:

这是一个小样本