Как создать новую структуру данных в C ++ с объектной ориентацией? - PullRequest
0 голосов
/ 15 августа 2010

В этом семестре в университете у меня есть класс Data Structures, и профессор позволил студентам выбирать свой любимый язык.Поскольку я хочу быть программистом игры и больше не могу владеть Java, я выбрал C ++ ... но сейчас я застрял в этом вопросе.Я должен сделать следующее: создать SuperArray, который похож на массив Delphi (вы можете выбрать его начальный и конечный индекс).Мой код выглядит следующим образом:

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

Что мне делать?

Ответы [ 3 ]

6 голосов
/ 15 августа 2010

В отличие от Java, в C ++ не требуется , чтобы использовать ключевое слово new для создания объектов. В Java все объекты хранятся в куче (бесплатное хранилище) и доступны только по ссылкам.

В C ++ объекты могут быть типами значений. Вы можете объявить их прямо в стеке, например,

SuperArray array(start, end);

И вы можете вызывать методы, такие как:

array.get(1);

Этот объект будет автоматически уничтожен, когда array выйдет из области видимости. Если вы хотите управлять временем жизни объекта array вручную, вы можете опционально создать его в куче, используя new, но затем вам нужно обратиться к нему с указателем:

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

Теперь вы должны вызывать такие методы:

array->get(i);

, поскольку array в этом случае является указателем на SuperArray, а не на SuperArray (и у указателя нет собственного метода get). Оператор -> означает использование оператора . для намеченного объекта.

В этом случае объект, на который указывает указатель array, будет продолжать существовать до тех пор, пока вы не вызовете delete array; Если вам не удастся явно удалить объект, он никогда не будет освобожден (C ++ не имеет сборщика мусора!) И у вас будет утечка памяти.

Обратите внимание, что в C ++ есть вещи, называемые «указателями», и вещи, называемые «ссылками». Java "ссылка" имеет некоторые свойства обеих этих вещей и не является прямо эквивалентным ни тому, ни другому. Хороший вводный текст на C ++ должен объяснить разницу между ними.

1 голос
/ 15 августа 2010

По крайней мере, в качестве отправной точки (и, вероятно, навсегда, если только профессор не заставил меня изменить его), я бы использовал std::vector для управления хранилищем и просто написал бы внешний интерфейс, который управляет смещениями индексов какНужно.

Редактировать: если бы меня заставили это изменить, я бы все равно изучил интерфейс std::vector и максимально имитировал бы его, поэтому почти единственным изменением было бы (возможно) ненулевая нижняя граница индекса.Я также изучал бы, как это управляет памятью, и подражал этому также.Наконец, я бы сегментировал вещи примерно одинаково - т.е. имел бы один класс, который просто управляет вектором с фиксированной нижней границей нуля, и второй класс, который просто обрабатывает смещение к индексам, необходимым для ненулевого пониженияоценка.

1 голос
/ 15 августа 2010

array должен быть указателем для размещения в куче. Измените его определение на:

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

Вы можете избавиться от указателя, разместив массив в локальном стеке:

SuperArray array(start,end); 

Достаточно стекового объекта, если вы не собираетесь передавать общий объект в модули.

...