【问题标题】:C++ : defining a two-dimensional array of a inner-class structC++:定义内部类结构的二维数组
【发布时间】: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++ 教科书中找到更多信息。

标签: c++ arrays class struct


【解决方案1】:

对于第一个错误: 你应该检查你的包含。很可能缺少一个来完成您的结构“像素”。您似乎使用了 SDL_Rect,但我在您的头文件中看不到 SDL 的包含。

对于您的第二个错误: 要使数组更具动态性,您必须创建一个 array.size() + 1 的新数组 (arrayTwo) 并自己将所有数据从数组复制到 arrayTwo。 您也可以使用一个(或两个嵌套向量用于 2d),但这取决于您的性能需求。

【讨论】:

  • 我已经编辑了问题以提供包含,因为它们在原始代码中。我很欣赏这种对可变长度数组问题的纯数组解决方案。我也会对向量的内存使用做一些研究;如果不是太重的话,这似乎是一种更可行的方法。
猜你喜欢
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 2021-04-21
  • 2017-07-01
  • 2012-02-28
  • 2021-09-22
  • 1970-01-01
相关资源
最近更新 更多