Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;使用对象定向?_C++_Mingw32 - Fatal编程技术网

C++ 如何在C++;使用对象定向?

C++ 如何在C++;使用对象定向?,c++,mingw32,C++,Mingw32,这学期我在大学里上了一门叫做数据结构的课,教授允许学生选择他们最喜欢的语言。因为我想成为一个游戏程序员,我不能再拿java了,我选择C++…但是现在我被这种语言的知识所困扰。我必须做以下工作:创建一个超级数组,它就像一个Delphi数组(你可以选择它的开始和结束索引)。我的代码如下: main.cpp #include <iostream> #include "SuperArray.h" using namespace std; int main(int argc, ch

这学期我在大学里上了一门叫做数据结构的课,教授允许学生选择他们最喜欢的语言。因为我想成为一个游戏程序员,我不能再拿java了,我选择C++…但是现在我被这种语言的知识所困扰。我必须做以下工作:创建一个超级数组,它就像一个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); 
}
超级阵列

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

我应该怎么做?

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

SuperArray* array = new SuperArray(start,end); 
您可以通过在本地堆栈上分配数组来除去指针:

SuperArray array(start,end); 

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

< P>不像java,C++中不需要使用<代码>新< /Cord>关键字来创建对象。在Java中,所有对象都存储在堆(空闲存储)上,只能通过引用访问

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

SuperArray array(start, end);
您可以调用如下方法:

array.get(1);
array
超出范围时,此对象将自动销毁。如果要手动管理
数组
对象的生存期,可以选择使用
new
在堆上创建它,但必须使用指针引用它:

SuperArray* array = new SuperArray(start, end);
现在,您必须调用如下方法:

array->get(i);
因为在这种情况下,
array
是指向
SuperArray
的指针,而不是
SuperArray
本身(指针本身没有
get
方法)。
->
操作符意味着在指向的对象上使用
操作符

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


<>注意C++有一些叫做指针的东西和被称为“引用”的东西。Java“引用”具有这两个方面的某些属性,并不直接等同于这两个方面。C++上的一篇好的介绍性文本应该解释这些之间的区别。

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


编辑:如果我被迫改变这一点,我仍然会研究
std::vector
的接口,并尽可能多地模仿它,因此几乎唯一的改变将是索引上的(可能)非零下限。我也会研究它是如何管理记忆的,并模仿它。最后,我将以同样的方式进行分割——即,有一个类只管理一个具有固定下限为零的向量,第二个类只处理非零下限所需的索引偏移量。

应该解释为什么它们不同!面向对象与面向对象?请记住,对于每一个“new”,您还必须编写一个“delete”。别忘了实现一个复制构造函数,或者让你的类不可复制。你不觉得这样做会给你自己带来学习一门新语言的过度压力吗?我的意思是,如果有人让我用任何一种语言写一本书,我会选择一种我知道的语言。他不会允许的。这个类的意义是从底层构建数据结构,而不是使用STL或任何非原始的东西。
SuperArray* array = new SuperArray(start, end);
array->get(i);