如何在面向对象的C++中创建新的数据结构?

Bru*_*ero 0 c++ mingw32

这个学期在大学我有一个名为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); 
}
Run Code Online (Sandbox Code Playgroud)

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 */
Run Code Online (Sandbox Code Playgroud)

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];
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译此代码时,我有以下错误:

error: conversion from `SuperArray*' to non-scalar type `SuperArray' requested
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

Tyl*_*nry 6

与Java不同,在C++中,您不需要使用new关键字来创建对象.在Java中,所有对象都存储在堆(免费存储)中,并且只能通过引用访问.

在C++中,对象可以是值类型.您可以直接在堆栈上声明它们,例如

SuperArray array(start, end);
Run Code Online (Sandbox Code Playgroud)

你可以调用以下方法:

array.get(1);
Run Code Online (Sandbox Code Playgroud)

array超出范围时,此对象将自动销毁.如果要array手动管理对象的生命周期,可以选择在堆上创建它new,但是必须使用指针引用它:

SuperArray* array = new SuperArray(start, end);
Run Code Online (Sandbox Code Playgroud)

现在,你必须调用这样的方法:

array->get(i);
Run Code Online (Sandbox Code Playgroud)

因为array在这种情况下是指向a SuperArray而不是SuperArray自身的指针(并且指针没有get自己的方法).该->运营商是指使用.运营商的所指对象.

在这种情况下,array指针指向的对象将继续存在,直到您调用delete array;如果您未能显式删除该对象,它将永远不会被释放(C++没有垃圾收集器!)并且您将有内存泄漏.

请注意,C++具有称为"指针"的东西和称为"引用"的东西.Java"引用"具有这两者的一些属性,并不直接等同于任何一种.关于C++的一个很好的介绍性文本应该解释它们之间的区别.