gpt4 book ai didi

c++ - (继承类)c++ 不存在默认构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 12:49:51 28 4
gpt4 key购买 nike

程序的目的:该程序的目的是创建一个仅使用控制台的基本 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

子弹.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() {
}

子弹.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

最佳答案

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

默认行为是使用基类的默认构造函数。但是,您可以通过将其添加到 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
{}

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

关于c++ - (继承类)c++ 不存在默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49543399/

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