【问题标题】:Dynamic alocation an array of Images in C++ Builder在 C++ Builder 中动态分配图像数组
【发布时间】:2015-12-07 19:44:41
【问题描述】:

我想做一个二十一点游戏。

我想制作一个图像矢量,当我按下按钮时会显示一个新图像(需要 2 或 3 张图像)。

之后,我想在另一个按钮按下时将它们全部删除。

我尝试在主类(Unit1.h)中声明一个向量:

class TForm1 : public TForm{

...

public: TImage* Images[];

在 Form1(Unit1.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];
    }
}

【问题讨论】:

  • a) 我看不到vector 的用法,b) 为什么你在这里显式调用析构函数Images[k]-&gt;~TImage()?和 c),C++ 数组索引从 0 开始,而不是 1。
  • 是的,我没有矢量,我想删除那些图像,这是一种使用析构函数的方式吗?我已经看到它适用于删除

标签: c++ c++builder


【解决方案1】:

您没有声明向量。 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();
}

【讨论】:

  • 非常感谢,对我帮助很大
猜你喜欢
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
相关资源
最近更新 更多