(继承的类)c ++没有默认的指令器

时间:2018-03-28 20:14:38

标签: c++ visual-studio class object visual-c++

计划的目的:此计划的目的是仅使用控制台创建基本的2D游戏。该程序目前只创建一个带有键" wasd"的可移动框。我计划加入子弹,敌人的NPC,障碍等等。

问题: 您好,出于某种原因我的子弹构造函数类在我的" Bullet.cpp"文件显示错误"错误C2512:' BoxClass':没有合适的默认构造函数"。在" Bullet.h"我有" class Bullet : protected BoxClass"。为什么我会收到此错误?

其他问题: 另外我应该如何分组我的标题?他们将成为一个庞大的集群。

注释: 我也意识到我的游戏循环不应该在" BoxClass.cpp"中。在我的子弹课上工作之后,我会解决这个问题。如果我构建了其他任何错误的内容,或者如果您看到更简单的方法来编写一些相同的代码,请告诉我。

这是我在c ++中的第一个图形游戏!

ConsolApplication1.cpp:

#include "stdafx.h"
#include <windows.h>
#include "BoxClass.h"
#include "ConsolWindow.h"
#include "Bullet.h"
#include <iostream>

using namespace std;

#define W_KEY 0x57
#define S_KEY 0x53
#define A_KEY 0x41
#define D_KEY 0x44
#define R_KEY 0x52

int main() {
    //variable declaration/definition
    int right_Wall, speed_Var;

    //Consol Size/Position
    int half_screen_Size = (GetSystemMetrics(SM_CXSCREEN)/2);
    Set_Consol_Size(half_screen_Size, GetSystemMetrics(SM_CYSCREEN));
    Position_Consol(-6, 0);

    while (1) {
        cout << "Enter speed of rectangle/box\nSpeed = ";
        cin >> speed_Var;

        BoxClass box1(4, 3);
        box1.Print_Solid_Rectangle();

        cout << "\n\nMove the rectangle with wasd\n\n";


        //Rectangle Movement
        box1.Rectangle_Movement(speed_Var);
    }
    //exit
    return 0;
}

BoxClass.cpp:

#include "stdafx.h"
#include "BoxClass.h"
#include "ConsolWindow.h"
#include <iostream>
#include <math.h>
#include <Windows.h>
using namespace std;

#define W_KEY 0x57
#define S_KEY 0x53
#define A_KEY 0x41
#define D_KEY 0x44
#define R_KEY 0x52

#define _NOT_MOVING 0
#define _MOVING 1

    //Non Moving Rectangle
    void BoxClass::Print_Solid_Rectangle() {
        //calc
        boxSpacesWidth = (3 * recWidth) - 4;

        //draw top of box
        for (width = 1; width < recWidth; width += 1) {
            cout << "...";
        }
        cout << "\n";

        //draw sides
        for (height = 1; height < recHeight; height += 1) {
            cout << ":";
            height_Count++;

            for (width = 1; width < boxSpacesWidth; width += 1) {
                cout << " ";
            }

            cout << ":\n";
        }

        //draw bottom
        cout << ":";

        for (width = 1; width < boxSpacesWidth; width += 1) {
            cout << ".";
        }
        cout << ":\n";
    }

    //Moving Rectangle
    void BoxClass::Print_Rectangle_Moving(int x, int y, int horizontalSpaces, int verticleSpaces) {
        //calc
        boxSpacesWidth = (3 * x) - 4;
        rightWall = ((x-1)*3) + horizontalSpaces;
        retrieveX = (ceil((((x-1)*3)/2))+1)+horizontalSpaces;
        retrieveY = verticleSpaces;
        cout << retrieveY<<endl;

        //New Line
        for (i = 1; i <= verticleSpaces; i += 1) {
            cout << "\n";
        }

        //draw top of box
        for (width = 1; width <= horizontalSpaces; width+=1) {
            cout << " ";
        }

        for (width = 1; width < x; width += 1) {
            cout << "...";
        }
        cout << "\n";

        //draw sides
        for (height = 1; height < y; height += 1) {

            for (width = 1; width <= horizontalSpaces; width += 1) {
                cout << " ";
            }

            cout << ":";
            height_Count++;

            for (width = 1; width < boxSpacesWidth; width += 1) {
                cout << " ";
            }

            cout << ":\n";
        }

        //draw bottom
        for (width = 1; width <= horizontalSpaces; width += 1) {
            cout << " ";
        }

        cout << ":";

        for (width = 1; width < boxSpacesWidth; width += 1) {
            cout << ".";
        }
        cout << ":\n";
    }

    void BoxClass::Rectangle_Movement(int speed) {
        speed_Var = speed;

        //Rectangle Movement
        while (GetAsyncKeyState(VK_ESCAPE) == false) {

            if (GetAsyncKeyState(R_KEY)) {
                system("CLS");
                break;
            }

            if (GetAsyncKeyState(W_KEY)) {
                if (verticleCount > 0) {
                    system("CLS");
                    verticleCount = verticleCount - speed_Var;
                    Print_Rectangle_Moving(recWidth, recHeight, horizontalCount, verticleCount);
                }
            }

            if (GetAsyncKeyState(S_KEY)) {
                system("CLS");
                verticleCount = verticleCount + speed_Var;
                Print_Rectangle_Moving(recWidth, recHeight, horizontalCount, verticleCount);
            }

            if (GetAsyncKeyState(A_KEY)) {
                if (horizontalCount > 0) {
                    system("CLS");
                    horizontalCount = horizontalCount - (speed_Var*2);
                    Print_Rectangle_Moving(recWidth, recHeight, horizontalCount, verticleCount);
                }
            }

            if (GetAsyncKeyState(D_KEY)) {
                if (rightWall < 113) {
                    system("CLS");
                    horizontalCount = horizontalCount + (speed_Var*2);
                    Print_Rectangle_Moving(recWidth, recHeight, horizontalCount, verticleCount);
                }
            }

            if (GetAsyncKeyState(VK_SPACE)) {

            }
        }
    }

    // constructor
    BoxClass::BoxClass(int x, int y) {

        //variable definition
        height_Count = 1;

        speed_Var = 1;
        horizontalCount = 0; 
        verticleCount = 0;

        recWidth = x;
        recHeight = y;
    };  

BoxClass.h:

#ifndef BOXCLASS_H
#define BOXCLASS_H


class BoxClass {
    unsigned short int width;
    int height, i, recWidth, recHeight, rightWall;
    float boxSpacesWidth, height_Count;

    int width_Var, height_Var, position_Var;
    int speed_Var = 1;
    unsigned short int horizontalCount = 0, verticleCount = 0;


protected:
    //retrieve values for bullet spawn location
    int retrieveX, retrieveY;

public:
    void Print_Rectangle_Moving(int x, int y, int horizontalSpaces, int verticleSpaces);

    void Print_Solid_Rectangle();

    void Rectangle_Movement(int speed);

    // constructor
    BoxClass(int x, int y);
};

#endif

Bullet.cpp:

#include "stdafx.h"
#include "Bullet.h"
#include <iostream>
#include <Windows.h>

using namespace std;

void Bullet::Bullet_Draw_Collision() {

    for (int height = 1; height <= 2; height+=1) {
        cout << "|\n";
    }

}



Bullet::Bullet() {
}

Bullet.h:

#ifndef BULLET_H
#define BULLET_H

#include "BoxClass.h"

class Bullet : public BoxClass {

public:
    void Bullet_Draw_Collision();

    //constructor
    Bullet();

};
#endif

ConsolWindow.cpp:

#include "stdafx.h"
#include "ConsolWindow.h"
#include <iostream>
#include <Windows.h>
using namespace std;

int Find_Consol_Size() {
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    int columns, rows;

    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    columns = csbi.srWindow.Right - csbi.srWindow.Left + 1;
    rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;

    return columns;
}

void Set_Consol_Size(int x, int y) {
    HWND console = GetConsoleWindow();
    RECT r;
    GetWindowRect(console, &r);
    MoveWindow(console, r.left, r.top, x, y, TRUE);
}

void Position_Consol(int x, int y) {
    HWND consoleWindow = GetConsoleWindow();
    SetWindowPos(consoleWindow, 0, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}

ConsolWindow.h:

#ifndef CONSOLWINDOW_H
#define CONSOLWINDOW_H

int Find_Consol_Size();
void Set_Consol_Size(int x, int y);
void Position_Consol(int x, int y);

#endif

1 个答案:

答案 0 :(得分:0)

在c ++中,构造派生类型意味着必须构造对象的基础部分和派生部分。这是通过在派生类型的构造函数可以开始之前调用base的构造函数来完成的。

默认行为是使用base的默认构造函数。但是,您可以通过将其添加到member initialization list并为其提供适当的参数来指示要使用的其他基础构造函数。

在您的情况下,请注意BoxClass只有一个构造函数必须提供xy,但Bullet没有这样的构造论证。也许某些默认值(如零或一些)可能是合适的,但我怀疑您会想要将这些参数添加到Bullet类中。以下是一些示例,说明如何解决问题。

通过询问Bullet的构造参数:

class Bullet : public BoxClass 
{
public:
    //constructor
    Bullet(int x, int y);

};

Bullet::Bullet(int x, int y) : 
    BoxClass(x, y) // Indicates which BoxClass constructor to use
{}

通过向BoxClass提供任意构造参数:

class Bullet : public BoxClass 
{
public:
    //constructor
    Bullet();

};

Bullet::Bullet() : 
    BoxClass(1, 1)
{}

或者通过向BoxClass添加默认构造函数,例如通过为每个现有构造函数的参数提供默认值:

class BoxClass 
{ 
public:
    // This constructor is now a default constructor
    BoxClass(int x = 1, int y = 1);
};

class Bullet : public BoxClass 
{
public:
    //constructor
    Bullet();

};

Bullet::Bullet() // Uses the default BoxClass constructor
{}

哪种解决方案最好取决于您的设计目标,但我怀疑第一种解决方案可能更合适。