在C++Builder中动态定位一组图像
Dynamic alocation an array of Images in C++ Builder
我想制作一个21点游戏。
我想制作一个图像向量,当我按下按钮时,会显示一个新的图像(需要2或3个图像)。
在那之后,我想在另一个按钮按下删除所有它们。
我试图在主类(第一单元.h)中声明一个向量:
class TForm1 : public TForm{
public: TImage* Images[];
在Form1(第一单元.cpp)中:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// i=1 is global
Images[i] =new TImage(this);
Images[i]->Parent=this;
Images[i]->Picture->Bitmap->...//here i want to use it
i++;
}
在这里我想删除它们:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
for(int k=1;k<=i;i++) {
Images[k]->~TImage(); //delete Images[k];
}
}
您没有声明向量。std::vector
是C++中的一个实际类类型。您实际声明的是一个大小未知的静态数组。你不能那样做。您必须在编译时为大小指定一个常量,例如:
class TForm1 : public TForm
{
...
public:
TImage* Images[3];
};
如果您不知道编译时的映像数,则必须声明一个指针指向在运行时动态分配的数组:
class TForm1 : public TForm
{
...
public:
TImage** Images;
int TotalNumberOfImages;
int NumberOfImages;
__fastcall TForm1(TComponent *Owner);
__fastcall ~TForm1();
};
__fastcall TForm1::TForm1(TComponent *Owner)
: TForm(Owner)
{
TotalNumberOfImages = ...;
Images = new TImage*[TotalNumberOfImages];
NumberOfImages = 0;
}
__fastcall TForm1::~TForm1()
{
delete[] Images;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (NumberOfImages < TotalNumberOfImage)
{
TImage *img = new TImage(this);
img->Parent = this;
img->Picture->...
...
Images[NumberOfImages++] = img;
}
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
for(int k = 0; k < NumberOfImages; ++k)
delete Images[k];
NumberOfImages = 0;
}
如果你真的想使用std::vector
,它应该更像这样:
#include <vector>
class TForm1 : public TForm
{
...
public:
std::vector<TImage*> Images;
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TImage *img = new TImage(this);
img->Parent = this;
img->Picture->...
...
Images.push_back(img);
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
for(int k = 0; k < Images.size(); ++k)
delete Images[k];
/*
or:
for(std::vector<TImage*>::iterator iter = Images.begin(), end = Images.end(); iter != end; ++iter)
delete *iter;
*/
Images.clear();
}
或者,如果您使用的是Embarcadero的基于Clang的C++11编译器之一:
#include <vector>
#include <memory>
class TForm1 : public TForm
{
...
public:
std::vector<std::unique_ptr<TImage*>> Images;
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
std::unique_ptr<TImage> img(new TImage(this));
img->Parent = this;
img->Picture->...
...
Images.push_back(img);
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Images.clear();
}
相关文章:
- 在 c++ 中拥有一组结构的正确方法是什么?
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 一组值的零开销下标运算符
- 使用一组结构,避免在一组结构中出现重复的结构
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 合并一组模板专用化
- 如何更好地检查两个 char 变量是否在一组值中?
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- 给定一个枢轴点,按照它们与枢轴点构成的角度递增顺序对一组点进行排序
- 如何从一组变量中查找最低值
- 如何根据对的第二个元素对 STL c++ 中的一组对进行排序?
- 如何快速创建一组覆盖两个图像的图像
- 使用缝合一组图像的相机参数使用针迹不同的图像集
- 使用OpenCV?从一组2D图像切片重建3D模型
- 视觉C++库,用于在不使用Opencv的情况下将一组图像转换为视频
- openCV中一组点的形状检测(不使用图像)
- 提取一组样本图像的描述符,并在OpenCV中训练SVM
- 在C++Builder中动态定位一组图像
- 相机校准与有限的一组图像在OpenCV和c++