0

大学这个学期我有一门课叫数据结构,教授让学生选择自己喜欢的语言。由于我想成为一名游戏程序员,而我不能再学习 Java,所以我选择了 C++ ......但现在我对这门语言缺乏了解。我必须做以下事情:创建一个 SuperArray,它就像一个 Delphi 数组(你可以选择它的开始和结束索引)。我的代码如下:

主文件

#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); 
}

超阵列.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 */

超阵列.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++ 中您不需要使用new关键字来创建对象。在 Java 中,所有对象都存储在堆上(自由存储),并且只能通过引用访问。

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

SuperArray array(start, end);

您可以调用如下方法:

array.get(1);

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

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

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

array->get(i);

因为array在这种情况下是指向 aSuperArray而不是 aSuperArray本身的指针(并且指针没有get自己的方法)。->运算符是指.对所指向的对象使用运算符。

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

请注意,C++ 有称为“指针”的东西和称为“引用”的东西。Java“引用”具有这两种东西的一些属性,并且不直接等同于任何一种。一篇好的 C++ 介绍性文本应该解释这些之间的区别。

于 2010-08-15T04:04:10.070 回答
1

至少作为一个起点(并且可能是永久的,除非教授让我改变它)我会使用 anstd::vector来管理存储,并且只需编写一个前端来根据需要管理索引的偏移量。

编辑:如果我被迫改变它,我仍然会研究std::vector它的界面,并尽可能地模仿它,所以几乎唯一的变化是索引的(可能)非零下限。我还会研究它如何管理内存,并模仿它。最后,我会以相同的方式对事物进行分割——即,有一个类只管理一个固定下限为零的向量,第二个类只处理非零下限所需的索引偏移量边界。

于 2010-08-15T04:17:35.837 回答
1

array应该是要在堆上分配的指针。将其定义更改为:

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

您可以通过在本地堆栈上分配数组来摆脱指针:

SuperArray array(start,end); 

如果您不打算跨模块传递共享对象,则堆栈对象就足够了。

于 2010-08-15T04:00:36.553 回答