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的大小".请帮我弄清楚错误.=(
尽管您的代码中存在设计/使用问题,但最明显的问题是您希望将类定义放在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++编写得有多好的误解.这并不是说你作为一个人不称职,但你提出的代码存在一些严重的问题.仅举几个:
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++书籍,它将涵盖这些类型的问题.(我必须强调,这些缺点都不是你作为一个人的陈述.我正在谈论你在问题中的代码.)