首先通过在C ++中向超类发送2D数组来初始化子类?

时间:2012-02-16 16:53:52

标签: c++ inheritance constructor multidimensional-array int

我正在尝试用C ++编写以下Java代码:

public class Block {
    private int[][] block;
    public Block(int[][] block) {
        this.block = block;
    }
}

public class Block1 extends Block {
    public Block1() {
        super(new int[][]{{2,3},{3,1}});
    }
}

下面你可以看到我将代码翻译到C ++的程度。基本上我希望Block是一个通用类,它帮助继承类(目前只有Block1)将有关它们的数据存储为2D数组。这些数组应该在子类的构造函数中初始化。 但是我不能让超级调用在Block1中正常工作,我也不知道如何将2D数组作为参数发送,或者如何再次正确地存储对它的引用。如果你们能告诉我这件事,那真是棒极了。

(我稍后会在课程中添加更多方法 - 这只是与问题相关的最基本的东西。)

Block.h:

#ifndef BLOCK_H_
#define BLOCK_H_

namespace mtch {

class Block {
public:
    Block(int _block[][2]);
    virtual ~Block();
private:
    int block[2][2];
};

} /* namespace mtch */
#endif /* BLOCK_H_ */

Block.cpp:

#include "Block.h"

namespace mtch {

Block::Block(int _block[][2]) {
    block = _block;
}

} /* namespace mtch */

Block1.h:

#include "Block.h"

#ifndef BLOCK1_H_
#define BLOCK1_H_

namespace mtch {

class Block1 : public Block {
public:
    Block1();
    virtual ~Block1();
};

} /* namespace mtch */
#endif /* BLOCK1_H_ */

Block1.cpp:

#include "Block1.h"

namespace mtch {

Block1::Block1() : Block(new int[][]{{2,2},{2,3}}) {
}

}

我希望你明白我在这里想要完成的事情。 :P

1 个答案:

答案 0 :(得分:0)

block是您定义的静态数组,您不能简单地为其指定动态数组以将指针弯曲到正确的内存位置。您必须将每个元素复制到块中。最简单的方法是使用std::vector<std::vector<int>>而不是int [2] [2]来阻止。另一种方法是在任何地方使用简单的一维数组。你可以创建int *类型的块,并使所有函数也采用int *。然后你可以在Block1()中新建int [4]并初始化Block1()体内的内存。此外,您必须确保删除[]内存,因为它不会像静态数组那样自动发生。多维数组有点icky