C ++ Копирование указателей - PullRequest
0 голосов
/ 11 мая 2011

Привет, я хотел бы знать, как я могу скопировать содержимое указателя 2d Array в C ++ в другое место и установить другой указатель на него, чтобы при внесении изменений в скопированный указатель ничего не происходило с исходными данными?

В основном это указатель массива на фигуры на шахматной доске. так что похоже на Piece * oldpointer = board[8][8]. Теперь я хочу скопировать все содержимое этого указателя, включая такие методы, как getvalue(), getcolor() и т. д., которые находятся в заголовочном файле Pieces, в другое место и установить на него указатель, чтобы я мог выполнять там операции и проверять его, не влияя на этот оригинал. данные? Я читал где-то, что я должен был использовать allocate(), но я не уверен. пожалуйста помогите

Ответы [ 3 ]

1 голос
/ 11 мая 2011

В C ++ вы можете определить тип 2D-массива следующим образом (вам нужен современный компилятор C ++):

#include <array>
typedef std::array<std::array<Piece, 8>, 8> board_t;

Если ваш компилятор не поддерживает std::array, вы можете использовать boost::array вместо:

#include <boost/array.hpp>
typedef boost::array<boost::array<Piece, 8>, 8> board_t;

Теперь вы можете использовать тип выше. Как я вижу, вам нужно скопировать объект, на который указывает указатель:

board_t* oldpointer = new board_t;

// do some with oldpointer

// now make a copy of the instance of the object oldpointer points to
// using copy-constructor
board_t* newpointer = new board_t( *oldpointer );
// now newpointer points to the newly created independent copy

// do more

// clean up
delete oldpointer;

// do more with newpointer

// clean up
delete newpointer;
1 голос
/ 11 мая 2011

Поскольку вы используете C ++, почему бы не определить конструктор копирования для вашего класса Piece?Тогда просто

Piece copied_piece(*board[8][8]);

Если ваш класс - POD, вы даже сможете обойтись с помощью конструктора копирования по умолчанию.

0 голосов
/ 11 мая 2011

Вы можете скопировать, выделив память в месте назначения, а затем memcopy

dest_pointer = (<<my type>>*) malloc(sizeof(<<my type>>);
memcpy(dest_pointer, src_pointer, sizeof(<<my type>>);

Кстати, методы никогда не копируются.они не принадлежат объекту.

...