0

大学の今学期はデータ構造というクラスがあり、教授は学生に好きな言語を選択させました。私はゲームプログラマーになりたいので、Javaを使用できなくなったので、C ++を選択しました...しかし、今ではこの言語の知識が不足しています。次のことを行う必要があります。Delphi配列のようなSuperArrayを作成します(開始インデックスと終了インデックスを選択できます)。私のコードは次のとおりです。

main.cpp

#include <iostream>
#include "SuperArray.h"    

using namespace std;

int main(int argc, char** argv) 
{
    int start, end;
    cout << "Starting index" << endl;
    cin >> start;
    cout << "Ending index:" << endl;
    cin >> end;
    SuperArray array = new SuperArray(start,end); 
}

superarray.h

#ifndef _SUPERARRAY_H
#define _SUPERARRAY_H

class SuperArray
{
public:
    SuperArray(int start, int end);
    void add(int index,int value);
    int get(int index);
    int getLength();
private:
    int start, end, length;
    int *array;

};

#endif  /* _SUPERARRAY_H */

superarray.cpp

#include "SuperArray.h"

SuperArray::SuperArray(int start, int end)
{
    if(start < end)
    {
        this->start = start;
        this->end = end;
        this->length = (end - start) + 1;
        this->array = new int[this->length];
    }
}

void SuperArray::add(int index, int value)
{
    this->array[index-this->start] = value;
}

int SuperArray::get(int index)
{
    return this->array[index-this->start];
}

このコードをコンパイルしようとすると、次のエラーが発生します。

error: conversion from `SuperArray*' to non-scalar type `SuperArray' requested

私は何をすべきか?

4

3 に答える 3

6

Javaとは異なり、C ++では、オブジェクトを作成するためにキーワードを使用する必要はありません。newJavaでは、すべてのオブジェクトはヒープ(フリーストア)に格納され、参照を介してのみアクセスできます。

C ++では、オブジェクトは値型にすることができます。スタック上で直接宣言できます。例:

SuperArray array(start, end);

そして、次のようなメソッドを呼び出すことができます。

array.get(1);

arrayこのオブジェクトは、スコープ外になると自動的に破棄されます。arrayオブジェクトの存続期間を手動で管理する場合は、オプションでを使用してヒープ上にオブジェクトを作成できnewますが、ポインターを使用してオブジェクトを参照する必要があります。

SuperArray* array = new SuperArray(start, end);

ここで、次のようなメソッドを呼び出す必要があります。

array->get(i);

arrayこの場合、それ自体ではなくaへのポインタであるため(そしてポインタには独自のSuperArrayメソッドがありません)。演算子とは、ポイントされたオブジェクトで演算子を使用することを意味します。SuperArrayget->.

この場合、arrayポインタが指すオブジェクトは、呼び出すまで存在し続けますdelete array;。オブジェクトを明示的に削除しなかった場合、オブジェクトの割り当てが解除されることはなく(C ++にはガベージコレクタがありません!)、メモリリークが発生します。

C ++には、「ポインタ」と呼ばれるものと「参照」と呼ばれるものがあることに注意してください。Javaの「参照」には、これら両方の特性のいくつかがあり、どちらとも直接同等ではありません。C ++に関する優れた入門テキストでは、これらの違いを説明する必要があります。

于 2010-08-15T04:04:10.070 に答える
1

arrayヒープに割り当てられるポインタである必要があります。その定義を次のように変更します。

SuperArray* array = new SuperArray(start,end); 

ローカルスタックに配列を割り当てることで、ポインタを取り除くことができます。

SuperArray array(start,end); 

モジュール間でオブジェクトを受け渡しする予定がない場合は、スタックオブジェクトで十分です。

于 2010-08-15T04:00:36.553 に答える
1

少なくとも出発点として(そしておそらく教授が私に変更させない限り、永久に)std::vectorストレージを管理するためにを使用し、必要に応じてインデックスへのオフセットを管理するフロントエンドを作成します。

編集:私がそれを変更することを余儀なくされた場合でも、私はまだstd::vectorのインターフェースを研究し、可能な限りそれを模倣するので、ほとんど唯一の変更はインデックスの(おそらく)ゼロ以外の下限です。また、それがどのようにメモリを管理するかを研究し、それを模倣します。最後に、ほぼ同じ方法でセグメント化します。つまり、ゼロの固定下限を持つベクトルを管理する1つのクラスと、ゼロ以外の下限に必要なインデックスへのオフセットを処理する2番目のクラスがあります。バウンド。

于 2010-08-15T04:17:35.837 に答える