C++ 在c+中初始化二维对象数组+;
我知道以前有人问过这个问题(或类似的变化),但我无法让它工作 我正在尝试创建一个棋盘游戏,它由一个充满方块的棋盘组成。我试图将我的电路板建模为二维方形对象阵列。可以创建任意宽度或高度的板,这些参数通过构造函数传入。以下是我正在使用的代码:C++ 在c+中初始化二维对象数组+;,c++,arrays,C++,Arrays,我知道以前有人问过这个问题(或类似的变化),但我无法让它工作 我正在尝试创建一个棋盘游戏,它由一个充满方块的棋盘组成。我试图将我的电路板建模为二维方形对象阵列。可以创建任意宽度或高度的板,这些参数通过构造函数传入。以下是我正在使用的代码: Board.h #ifndef BOARD_H #define BOARD_H #include "Square.h" class Board{ public: Board(int w, int h); private: Square *
Board.h
#ifndef BOARD_H
#define BOARD_H
#include "Square.h"
class Board{
public:
Board(int w, int h);
private:
Square **squares;
const int width;
const int height;
};
#endif
Board.cpp
#include "Board.h"
Board::Board(int w, int h):width(w), height(h) {
squares = new Square*[width];
for (int i = 0; i < width; i++) {
squares[i] = new Square[height];
}
}
有什么想法吗?这是否可能在C++中?< p>你的代码相当于:
struct Foo
{
Foo(int){} // no default constructor
// Foo() = default; /* uncomment this and it will work */
};
int main()
{
Foo* pFoo = new Foo[10]; // need a default ctor
delete[] pFoo;
}
问题是在Foo*pFoo=newfoo[10]的rhs上
,您正在分配内存并创建10Foo
对象。编译器不知道如何执行后者(创建对象),因为您没有提供默认构造函数。要使上述代码按原样工作,您需要为每个对象的非默认ctor指定所有参数,如:
Foo* pFoo = new Foo[10]{1,2,3,4,5,6,7,8,9,0}; // this will work
更好的替代方法是使用。如果您想知道为什么后者不需要没有默认构造函数的对象就可以工作,那是因为它使用,并根据需要初始化元素
您可以查看如何使用placementnew
执行此操作
编辑
代码
Foo* pFoo = new Foo[10]{1,2,3,4,5,6,7,8,9,0};
在gcc中编译,但clang无法编译它(使用
-std=c++11
标志)。后续问题。您要求它构造一个由n个正方形组成的缓冲区。它试图这样做,但失败了,因为它无法建造它们
如果您需要n
方块的内存,请使用new std::aligned\u storage\u t[Count]
。然后使用placement new依次构造每个元素
但这是一个愚蠢的想法。它复杂、不透明且容易出错
简而言之,停止手动管理内存
vector
为您解决了这个问题
创建一个正方形向量。或者创建一个平面向量,然后进行数学运算以找到索引。它在内部执行对齐的存储位,并使用新的位置按需构建,因此您不必自己编写危险而棘手的代码
向量让您可以动态高效地增长它们,并很好地替换手动管理的阵列。但是你需要把它们从最小的元素变成最大的元素。如果您不希望这样做,请使用唯一PTR的向量进行平方运算,并根据需要进行分配(或者,std::experional::optional
如果您使用C++17/1z编译器)
或者只需使用从对
到正方形
的映射,并使其稀疏。请注意,如果您不希望正方形有默认的ctor,您将被定位到emplace,而不调用[]
。同样,您可以使用唯一的PTR进行平方运算,而不是直接进行平方运算
有很多很多选择
也考虑有一个默认的平方cTor:正则类型是很棒的。< /P> < P>作为另一个答案,你可以创建一个平面向量并做一些简单的算术运算来计算索引。< /P>
int main() {
// dimensions of the board
int width = 100;
int height = 102;
// some coordinates on the board
int x = 10;
int y = 32;
// allocate memory for every element on the board (10200 elements)
int * board = new int[width * height];
// access element (x, y) of the board
int val = board[y*width + x]
// don't forget to delete dynamic memory!
delete [] board;
}
没有两个不同的坐标具有相同的索引。尽量不要手动分配内容。使用
std::vector
有什么问题?当您对这样的类调用new
时,它将调用默认构造函数,因为这是您隐式要求它执行的操作。Square
是否有默认构造函数?更改const int width代码>到整数宽度代码>,同上int height
-并显示Square
@vsoftco Square的声明没有默认构造函数-它的构造函数采用一个参数(布尔值)。选择不具有默认构造函数意味着您选择不允许在默认状态下创建对象。因此,您不能对新对象进行阵列,您必须单独创建新对象。你可以创建一个std::vector
,只要你emplace_back
eachSquare
到每一行();您可以将方块
变成***方块
并手动分配/创建每个方块;你可以把方块
变成std::vector
,但是你必须小心地放置你的初始方块。对!但为什么不让他调用构造函数呢?@talha是“让他”——他让它调用默认的构造函数。它就这样做了。发现它不见了。所以它给了他一个错误。谢谢!真的解释得很好。
int main() {
// dimensions of the board
int width = 100;
int height = 102;
// some coordinates on the board
int x = 10;
int y = 32;
// allocate memory for every element on the board (10200 elements)
int * board = new int[width * height];
// access element (x, y) of the board
int val = board[y*width + x]
// don't forget to delete dynamic memory!
delete [] board;
}