Инициализировать подкласс, отправив сначала двумерный массив суперклассу в C ++? - PullRequest
0 голосов
/ 16 февраля 2012

Я пытаюсь закодировать следующий код Java в C ++:

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) хранить данные о них в виде двумерных массивов.Эти массивы должны быть инициализированы прямо в конструкторе подклассов.Но я не могу заставить супер-вызов работать правильно в 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 голосов
/ 16 февраля 2012
Блок

- это статический массив, как вы его определили, вы не можете просто назначить ему динамический массив, чтобы изгибать указатели в нужном месте памяти.Вы должны будете скопировать каждый элемент в блок.Самый простой способ - использовать std::vector<std::vector<int>> вместо int [2] [2] для блока.Другой способ - везде использовать простой одномерный массив.вы бы сделали блок типа int * и все функции тоже взяли int *.Затем вы можете просто добавить новый int [4] в Block1 () и инициализировать память внутри тела Block1 ().Также вам нужно будет удалить [] память, потому что это не произойдет автоматически, как это происходит со статическим массивом.Многомерные массивы немного icky

...