gpt4 book ai didi

c++ - ArrayList 的大小未知帮助

转载 作者:太空狗 更新时间:2023-10-29 20:06:43 24 4
gpt4 key购买 nike

我有这个代码

主要.cpp

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

using namespace std;

int main()
{
ArrayList *al = new ArrayList;
return 0;
}

函数.h

using namespace std;
#ifndef FUNCTS_H_INCLUDED
#define FUNCTS_H_INCLUDED

class ArrayList;
#endif // FUNCTS_H_INCLUDED

函数.cpp

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

class ArrayList{
public:
void add(int num);
void add(int num, int index);
void remove(int index);
void removeNum(int num);
string toString();
ArrayList(int init);
private:
void resize();
int size, cap;
int *myList[10];
};

void ArrayList::add(int num){
if (size>=cap/2)
{
resize();
}
*myList[size] = num;
size++;
}

void ArrayList::resize(){
int temp[cap*2];
int i;
for (i = 0; i < size; i++)
{
temp[i] = *myList[i];
}
*myList = temp;
}

ArrayList::ArrayList(){
size = 0;
cap = 10;
}

void ArrayList::add(int num, int index){
int temp = *myList[index];
int i;
for (i = index; i < size; i++)
{
*myList[index] = num;
num = temp;
temp = *myList[i+1];
}
add(temp);
}

string ArrayList::toString(){
string returnString = "{";
int i;
for (i = 0; i < size; i++)
returnString.append(*myList[i] +",");
returnString.replace(returnString.length()-1,1,"}");
return returnString;
}

我对 C++ 非常陌生,但每当我尝试编译代码时,它都会给我一个“ArrayList 的大小未知”的提示。请帮我找出错误。 =(

最佳答案

尽管代码中存在设计/使用问题,但最明显的问题是您想将类定义放在 functs.h 文件中而不是 functs.cpp 文件:

functs.h:

// This is declaration is highly not recommended for use in header files.
// using namespace std;

#ifndef FUNCTS_H_INCLUDED
#define FUNCTS_H_INCLUDED

#include <string>

class ArrayList{
public:
void add(int num);
void add(int num, int index);
void remove(int index);
void removeNum(int num);
std::string toString();
ArrayList(int init);
private:
void resize();
int size, cap;
int *myList[10];
};

#endif // FUNCTS_H_INCLUDED

functs.cpp:

#include "functs.h"

void ArrayList::add(int num){
if (size>=cap/2)
{
resize();
}
*myList[size] = num;
size++;
}

void ArrayList::resize(){
int temp[cap*2];
int i;
for (i = 0; i < size; i++)
{
temp[i] = *myList[i];
}
*myList = temp;
}

ArrayList::ArrayList(){
size = 0;
cap = 10;
}

void ArrayList::add(int num, int index){
int temp = *myList[index];
int i;
for (i = index; i < size; i++)
{
*myList[index] = num;
num = temp;
temp = *myList[i+1];
}
add(temp);
}

std::string ArrayList::toString(){
std::string returnString = "{";
int i;
for (i = 0; i < size; i++)
returnString.append(*myList[i] +",");
returnString.replace(returnString.length()-1,1,"}");
return returnString;
}

templatetypedef提供了为什么这是必要的原因。基本上,编译器需要知道 ArrayList 需要多少空间,而 class ArrayList; 不提供此类信息。


在头文件中声明 using namespace std; 不是一个好主意,因为这样每个包含 functs.h 文件的人(包括您的客户!)都会还有一个 using namespace std;,增加了名称冲突的可能性。


我强烈建议您选择a good introductory C++ book如果你想正确地学习 C++。你在你的问题中表现出对 C++ 编写得有多好的相当大的误解。这并不是说您作为一个人不称职,而是您提供的代码存在一些严重的问题。仅举几例:

  • 标准 C++ 已经提供了一个非常好的数组类,称为 std::vector。无需为您正在做的事情重新发明轮子。即使您必须重新发明轮子,对 C++ 的深入理解和丰富的 C++ 经验也是实现适合生产使用的数组容器的先决条件。
  • 您类(class)的公共(public)接口(interface)不完整。客户无法知道数组中实际有多少元素。
  • int *myList[10]; 声明一个包含 10 个指向 int 指针的固定数组。这不适用于数组类。尤其是当您希望数组可调整大小时。
  • 没有足够的内存管理让这个类在任何意义上都有用。没有析构函数,显然构造函数不完整(也不匹配),因此您没有真正合乎逻辑的地方来放置 new[]delete[] .
  • 您有一个ArrayList *al = new ArrayList;,但您在任何地方都没有相应的delete al;。这是内存泄漏。
  • 但最后一点没有实际意义,因为您应该使用 ArrayList a1; 而不是 ArrayList *al = new ArrayList;。前者会在范围​​末尾自动“删除”自身(在本例中为 main() 函数),而后者需要一个 delete 语句。 C++ 不像 Java,其中未使用的 new 对象会被自动收集。

我无法评论您使用的算法的正确性,因为(我很抱歉这么说,因为这听起来很刺耳)您所拥有的根本行不通。再次,我建议你拿起a good introductory C++ book ,这将涵盖这些类型的问题。 (我必须强调,这些缺点都不是你作为一个人的陈述。我说的是你问题中的代码。)

关于c++ - ArrayList 的大小未知帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6446589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com