【发布时间】:2021-12-28 21:54:59
【问题描述】:
我正在尝试用自己的伪像素为 SDL 构建一个窗口控制器。我让代码使用一个又大又丑的翻译单元工作,但现在我试图将相同的代码重构为多个单元和类。
在这个类中,我试图为窗口定义控制器,但我无法理解如何使用类中的嵌套结构。
我得到的错误是在线Pixel* pixels[][];。编译器抱怨“incomplete type is not allowed”。该结构似乎已在 .cpp 中完全定义。
第二个错误是“数组可能没有这种类型的元素”;我知道数组的第二维必须是定义的大小,但是如何在编译时定义这个大小,同时让我的代码灵活地适应不同大小的窗口?
//PxWindow.h
#include <SDL.h>
class PxWindow {
struct Pixel {
static int PARENT_PIXEL_SIZE;
// Data members
int x, y;
Color color;
// Methods
int screenX();
int screenY();
SDL_Rect getPixelRect();
};
// Private Data Member declarations
private:
int PIXEL_SIZE;
int NUM_PIXELS_X;
int NUM_PIXELS_Y;
// Public Data Member declarations
public:
Pixel* pixels[][];
SDL_Rect rects[][];
public:
PxWindow(int,int,int);
int getPixelSize();
int getNumX();
int getNumY();
};
// PxWindow.cpp
#include "PxWindow.h"
/*
* Pixel Structure method definitions
*/
SDL_Rect PxWindow::Pixel::getPixelRect() {
return SDL_Rect{ screenX(), screenY(), PARENT_PIXEL_SIZE, PARENT_PIXEL_SIZE };
};
int PxWindow::Pixel::screenX() { return x * PARENT_PIXEL_SIZE; }
int PxWindow::Pixel::screenY() { return y * PARENT_PIXEL_SIZE; }
/*
* PxWindow Class method definitions
*/
PxWindow::PxWindow(int px_size, int num_x, int num_y) :
PIXEL_SIZE(px_size),
NUM_PIXELS_X(num_x),
NUM_PIXELS_Y(num_y) {
Pixel::PARENT_PIXEL_SIZE = PIXEL_SIZE;
};
int PxWindow::getPixelSize() {
return PIXEL_SIZE;
};
int PxWindow::getNumX() {
return NUM_PIXELS_X;
};
int PxWindow::getNumY() {
return NUM_PIXELS_Y;
};
【问题讨论】:
-
"...因为数组元素不能是未知边界的数组,所以多维数组在第一个维度以外的维度上不能有未知边界:..." en.cppreference.com/w/cpp/language/array
-
我理解这个错误——当然除了第一个数组的每个维度都必须在编译时定义。我的问题正是:“..我如何在编译时定义这个大小,同时保持我的代码对不同大小的窗口灵活?”
-
你的说法自相矛盾。 “在编译时定义此大小”意味着对于“不同大小的窗口”,它固定为特定大小,并且在运行时不能更改。这两个陈述不可能都为真。
-
@Sam,你是对的。我应该更一般地询问我如何才能编译它,同时让它灵活地在运行时创建不同大小的窗口。
-
这就是
std::vector的用途。你知道如何使用std::vector吗?如果没有,您将在 C++ 教科书中找到更多信息。