【问题标题】:C++ Redefinition of Default Argument: Parameter 1 (Vector2D)默认参数的 C++ 重新定义:参数 1 (Vector2D)
【发布时间】:2019-04-18 20:33:42
【问题描述】:

我不断地重新定义默认参数参数 1 错误,并阻止成功构建项目以测试我包含的代码。我对 C++ 和这种构建游戏的形式相对较新,有多个头文件和 cpp 文件相互引用。

Texture2D.cpp:

#include <iostream>
#include <SDL_image.h>
#include <string>
#include "Texture2D.h"
#include "Constants.h"
#include "Commons.h"
using namespace::std;


Texture2D::Texture2D(SDL_Renderer* renderer)
{
    SDL_Renderer*   mRenderer   = NULL;
    SDL_Texture*    mTexture    = NULL;
    mWidth                  = 0;
    mHeight                 = 0;
}

Texture2D::~Texture2D()
{
    Free();
    mRenderer = NULL;
}

bool Texture2D::LoadFromFile(string path)
{
    //remove the memory used for a previous texture
    Free();
    SDL_Texture* mTexture = NULL;

    //load the image
    SDL_Surface* pSurface = IMG_Load(path.c_str());

    mWidth  = pSurface->w;
    mHeight = pSurface->h;

    if (pSurface != NULL)
    {
        mTexture = SDL_CreateTextureFromSurface(mRenderer, pSurface);

        if (mTexture == NULL)
        {
            cout << "Unable to create texture from surface. Error: " << SDL_GetError() << endl;
        }

        //Color key the image - The color to be transparent
        SDL_SetColorKey(pSurface, SDL_TRUE, SDL_MapRGB(pSurface->format, 0, 0xFF, 0xFF));

        SDL_FreeSurface(pSurface);
        return mTexture;
    }

    else
    {
        cout << "Unable to create texture from surface. Error: " << IMG_GetError() << endl;
    }
}

void Texture2D::Render(Vector2D newPosition, SDL_RendererFlip flip, double angle = 0.0f)
{
    //clear the screen
    SDL_SetRenderDrawColor(mRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
    SDL_RenderClear(mRenderer);

    //set where to render the texture
    SDL_Rect renderLocation = { 0, 0, mWidth, mHeight };

    //render to screen
    SDL_RenderCopyEx(mRenderer, mTexture, NULL, &renderLocation, 0, NULL, SDL_FLIP_NONE);
    SDL_RenderPresent(mRenderer);
}

void Texture2D::Free()
{
    if (mTexture != NULL)
    {
        SDL_DestroyTexture(mTexture);
        mTexture =  NULL;
        mWidth =    0;
        mHeight =   0;
    }
}

Texture2D.h:

#pragma once

#ifndef _TEXTURE2D_H
#define _TEXTURE2D_H
#include <SDL.h>
#include <SDL_image.h>
#include <map>
#include <string>
#include "Commons.h"

class Texture2D
{

public:
    Texture2D(SDL_Renderer* renderer);
    ~Texture2D();

    bool LoadFromFile(std::string path);
    void Free();
    void Render(Vector2D newPosition, SDL_RendererFlip flip, double angle = 0.0f);

    int GetWidth()  { return mWidth; }
    int GetHeight() { return mHeight; }

private:
    SDL_Renderer*   mRenderer;
    SDL_Texture*    mTexture;

    int             mWidth;
    int             mHeight;
};


#endif //_TEXTURE2D_H

Commons.h:

#pragma once
#ifndef _COMMONS_H
#define _COMMONS_H

struct Vector2D
{
    Vector2D()
    {
        x = 0.0f;
        y = 0.0f;
    }

    float x;
    float y;
};

struct InitialVector2D
{
    InitialVector2D()
    {
        initialx = 0.0f;
        initialy = 0.0f;
    }

    float initialx;
    float initialy;
};

enum SCREENS
{
    SCREEN_INTRO = 0,
    SCREEN_MENU,
    SCREEN_LEVEL1,
    SCREEN_LEVEL2,
    SCREEN_GAMEOVER,
    SCREEN_HIGHSCORES
};    
#endif //_COMMONS_H

【问题讨论】:

  • 哪一行有错误?
  • 只需在此处删除默认规范:void Texture2D::Render(Vector2D newPosition, SDL_RendererFlip flip, double angle = 0.0f) 正如编译器告诉您的那样,这已经在函数声明中给出。
  • 线 void Texture2D::Render(Vector2D newPosition, SDL_RendererFlip flip, double angle = 0.0f)
  • 有趣的事实:_TEXTURE2D_H 和 _COMMONS_H 是标准库实现之外的非法标识符。打破这条规则很少会伤害你,但当它这样做时,结果真的是莫名其妙......直到你意识到你已经打破了the rules about using an underscore in a C++ identifier。

标签: c++ build sdl redefinition


【解决方案1】:

当给出一个默认参数时,你应该只在头声明中添加默认值。所以,改变:

void Texture2D::Render(Vector2D newPosition, SDL_RendererFlip flip, double angle = 0.0f)

到:

void Texture2D::Render(Vector2D newPosition, SDL_RendererFlip flip, double angle)

应该修复错误。

【讨论】:

    【解决方案2】:

    只需在此处删除默认规范: void Texture2D::Render(Vector2D newPosition, SDL_RendererFlip flip, double angle = 0.0f) 正如编译器告诉您的那样,这已经在函数声明中给出。 – πάντα ῥεῖ 47 分钟前

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多