Octree データ構造を作成しましたが、まだ完全ではありません。コピー コンストラクタとデストラクタに苦労しています。これが私のヘッダーファイルです:
class Octree
{
public:
static int lastbranch;
static bool utolsoelotti;
struct node
{
int value;
node *child[8];
};
Octree();
~Octree();
Octree(const Octree& oct);
void clear(node* node);
node* searchandset(int dec, int value);
node* search(int dec);
node* step(node *node, int k);
node* copy(node *n);
void Print(node *n)const;
void deletebranch(int branch);
node *root;
};
コンストラクタ、デストラクタ、コピー コンストラクタ
Octree::Octree()
{
root = new node;
root->value = 0;
for (int i = 0; i < 8; i++)
root->child[i] = 0;
}
Octree::~Octree()
{
clear(root);
}
Octree::Octree(const Octree& oct) {
root = copy(oct.root);
}
void Octree::clear(node *node){
for (int i = 0; i < 8; i++)
if (node->child[i])
clear(node->child[i]);
delete node;
}
Octree::node*Octree::copy(node *n) {
node* n2 = new node;
if (n) {
for (int i = 0; i < 8; i++) {
n2->child[i] = copy(n->child[i]);
}
}
return n2;
}
そして、メインでオブジェクトを作成する方法は次のとおりです。
int main() {
Octree tree;
Octree tree2(tree);
tree.searchandset(8, 2);
tree2.Print(tree2.search(8));
return 0;
}
このsearchandset
関数では、最初のツリーでノード番号 8 の値を指定しています。その後、コピー コンストラクターを呼び出して、2 番目のツリーの 8 番目のノードを出力します。値は最初のツリーに指定したものと同じですが、デストラクターが呼び出されると、常に次の例外が発生します。
スローされた例外: 読み取りアクセス違反。ノードは 0xDDDDDDDD でした。
私が知っているように、すでに削除したノードを削除しようとしたことを意味します。オブジェクト「tree2」は、同じ値とノードを持つ「tree」とは別のオブジェクトですよね? 次に、上記の例外がわかりません。私はC ++が初めてで、それが基本的なものであることを知っているので、誰かが私を正しい方向に向けてくれれば、とても感謝しています.