ArrayList的大小是未知的帮助

if_*_*one 3 c++ initialization class

我有这个代码

main.cpp中

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

using namespace std;

int main()
{
    ArrayList *al = new ArrayList;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

functs.h

using namespace std;
#ifndef FUNCTS_H_INCLUDED
#define FUNCTS_H_INCLUDED

class ArrayList;
#endif // FUNCTS_H_INCLUDED
Run Code Online (Sandbox Code Playgroud)

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

我是C++的新手,但每当我尝试编译代码时,它都会给我一个"不知道ArrayList的大小".请帮我弄清楚错误.=(

In *_*ico 6

尽管您的代码中存在设计/使用问题,但最明显的问题是您希望将类定义放在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
Run Code Online (Sandbox Code Playgroud)

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

templatetypedef提供了必要的原因.基本上编译器需要知道需要多少空间ArrayList,并且不class ArrayList;提供这样的信息.


using namespace std;在头文件中声明并不是一个好主意,因为那么包含该functs.h文件的每个人(包括你的客户端!)也会有一个using namespace std;,增加了名称冲突的可能性.


如果您希望正确学习C++ ,我强烈建议您选择一本好的C++入门书.你在你的问题中证明了对C++编写得有多好的误解.这并不是说你作为一个人不称职,但你提出的代码存在一些严重的问题.仅举几个:

  • 标准C++已经提供了一个非常精细的数组类std::vector.没有必要为你正在做的事情重新发明轮子.即使你必须重新发明轮子,对C++的高级理解和大量的C++经验也是实现适合生产使用的数组容器的先决条件.
  • 您班级的公共界面不完整.客户端无法知道数组中实际有多少元素.
  • int *myList[10];声明一个10个指针的固定数组int.这不适用于数组类.特别是如果您希望数组可以调整大小.
  • 这个类没有足够的内存管理在任何意义上都有用.有没有析构函数和明显的构造是不完整的(也不匹配),所以你有没有真正的合乎逻辑的地方放东西像new[]delete[].
  • 你有一个,ArrayList *al = new ArrayList;但你没有相应的delete al;任何地方.这是内存泄漏.
  • 但最后一点是没有实际意义的,因为你应该使用ArrayList a1;而不是ArrayList *al = new ArrayList;.前者将在范围的末尾自动"删除"自身(在本例中为main()函数),而后者需要一个delete语句.C++不像Java那样new自动收集未使用的ed对象.

我不能对你使用的算法的正确性发表评论,因为(而且我很遗憾地说这是因为它听起来很苛刻)你所拥有的算法根本不起作用.同样,我建议您选择一本很好的入门C++书籍,它将涵盖这些类型的问题.(我必须强调,这些缺点都不是你作为一个人的陈述.我正在谈论你在问题中的代码.)