在类中声明数组并在构造函数中初始化它

时间:2018-04-21 20:52:15

标签: c++ arrays initialization declaration

我有以下问题:

我在头文件中有一个类,我想声明一个二维数组(map)。

然后我想在源文件(cpp)文件的构造函数中初始化它。

直到现在看起来像这样:

Headerfile:

class TForm1 : public TForm
{
private:    ...
public:
    __fastcall TForm1(TComponent* Owner);
    int map[][];
};

的资源文件:

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {

map[][] = { {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{ 1, 2, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 2, 1 },
{ 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1 },
{ 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 1, 7, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 7, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 3, 1, 1, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 3, 3, 3, 3, 3, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 3, 12, 3, 13, 3, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 3, 3, 14, 3, 3, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1 },
{ 1, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 2, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 3, 1, 0, 1, 3, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 },
{ 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 },
{ 1, 2, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 2, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
};

}

我知道这是非常错误但我无法在互联网上找到任何有用的解释如何正确地完成。

谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

它不漂亮而且灵活。也许你应该使用抽象工厂模式来做到这一点。我认为您可以使用std::vector而不是多维数组。它有许多优点,STL库可以使用std::vector来处理算法。例如:

class IMapInitializer
{
public:
    virtual void InitMap(std::vector<std::vector<int>>& map) = 0;
    virtual ~IMapInitializer(){}
};

class HardcordeMapInitializer : public IMapInitializer
{
public:
    virtual void InitMap(std::vector<std::vector<int>>& map) override
    {
        map = {{1,2,3},{1,2,3},{1,2,3}};
    }
};

class FileMapInitializer : public IMapInitializer
{
public:
    virtual void InitMap(std::vector<std::vector<int>>& map) override
    {
        //Read map from file
    }
};

//...
class TForm1 : public TForm
{
private:    ...
public:
    __fastcall TForm1(TComponent* Owner, IMapInitializer& mapInitializer );
    std::vector<std::vector<int>> map;
};

//...
__fastcall TForm1::TForm1(TComponent* Owner, IMapInitializer& mapInitializer ) : TForm(Owner) {

mapInitializer.InitMap(map);

借助此模式,您可以选择更好的方式来初始化地图并在开发过程中对其进行更改。

在我的示例中,我展示了2个工厂(hardcode和fileInput),您可以在以后考虑其他工具并使用它们。

答案 1 :(得分:1)

C ++不允许定义具有多个不确定维度的数组;可以写int[][15] = ...,但写int [][] = ...是不合法的。

如果您的所有尺寸都是动态的,我建议使用矢量矢量。请参阅以下程序说明:

class ClassWith2DArray {
public:
    ClassWith2DArray();
    vector<vector<int>> map;
};

ClassWith2DArray::ClassWith2DArray() : map ({{2,3},{3,4}}) {}


int main()
{
    ClassWith2DArray c;
    for (auto row : c.map) {
        for (auto column : row) {
            cout << column << " ";
        }
        cout << endl;
    }


    return 0;
}