通过首先将二维数组发送到 C++ 中的超类来初始化子类?

Posted

技术标签:

【中文标题】通过首先将二维数组发送到 C++ 中的超类来初始化子类?【英文标题】:Initialize subclass by first sending a 2D-array to the super class in C++? 【发布时间】:2012-02-16 16:53:52 【问题描述】:

我正在尝试用 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】:

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

【讨论】:

以上是关于通过首先将二维数组发送到 C++ 中的超类来初始化子类?的主要内容,如果未能解决你的问题,请参考以下文章

使用返回超类对象的超类方法 - Java

子类是不是从 Swift 中的超类扩展继承便利初始化程序?

C++调用同一个虚函数的超类函数

使用 MPI 发送二维数组

在 C++ 中初始化动态二维数组

C++二维数组(指针)做参数