作为另一个类成员的对象数组指针的语法
Syntax of a pointer for array of objects as member of another class
你好,我有两个定义类的文件。在其中一个,我试图使用指针声明另一个类的类数组,我有一些语法问题,我如何在第一个文件中声明这个?提前谢谢你
第一个文件:
#ifndef YARD_H_INCLUDED
#define YARD_H_INCLUDED
#include <iostream>
using namespace std;
class yard
{
public:
int yard_size;
car *car_array[];
int cars_in_yard;
yard();
void show() const
{
for (int i=0; i<=cars_in_yard;i++)
{
car_array[i]->show();
}
}
~yard()
{
yard_size=0;
delete car_array[cars_in_yard];
cars_in_yard= 0;
}
};
#endif // YARD_H_INCLUDED'
第二个是:
#ifndef CAR_H_INCLUDED
#define CAR_H_INCLUDED
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
class car
{
public:
char car_name[80];
double price;
int eng;
car();
void show() const
{
cout<<"Car Make : "<< *car_name <<" , Price: "<< price<<" , Engine : "<< eng <<" , cc";
}
};
car::car()
{
car_name[0]=0;
price=0.0;
eng=0;
}
#endif // CAR_H_INCLUDED'
car *car_array[];
是语法错误。数组大小必须在编译时已知。要使用运行时分级,您需要使用动态内存分配。
基于Yard
的析构函数;似乎这个数组中的汽车应该"属于"院子——也就是说,院子负责清理它们。
让Yard存储car
数组而不是存储car *
数组会更简单。但是我假设你已经决定存储一个car *
数组。
当然,最简单的方法是std::vector<car*> car_array;
(或者可以说,unique_ptr
的向量)。然而,由于您应该重新发明轮子,您需要做以下事情:
-
car **car_array;
- 在构造函数中,初始化这个(可能是
nullptr
) - 使
yard_size
和cars_in_yard
私有-您的院子需要准确地跟踪使用了多少内存 - 每当
yard_size
更新时,如果它变大了,你需要new[]
为car *
'添加一些新空间并从旧空间复制值,delete[]
为旧空间 - 当
cars_in_yard
增加时,您需要检查是否需要增加yard_size
- 每当
cars_in_yard
减少时,您需要删除不再在院子里的汽车,并将所有内容洗牌,以便没有间隙(当然除非您想允许间隙,但这样您的插入逻辑更复杂) - 有一个复制构造函数,一个复制赋值操作符,要么做正确的事情,要么被禁用
- 有一个析构函数,删除院子里的汽车和
car_array
。
试试这个邪恶的技巧:
#define MAX_NAME_LENGTH 64
struct car
{
char * p_name;
car() : p_name(NULL)
{ }
car(char const * const p_new_name)
{
if (p_name)
{
delete [] p_name;
}
const unsigned int size = strlen(p_new_name) + 1; // Remember that terminating nul char
p_name = new char(size);
strcpy(p_name, p_new_name); // Make a copy of the parameter string
}
};
如果你真的想正确使用动态内存,你的类会教你使用智能指针或唯一指针。
该技术是邪恶的,因为它没有使用使用动态内存的经过测试的数据结构,例如std::string
或std::vector
。
编辑1:
是的,邪恶,因为析构函数不存在,编译器生成的析构函数不会释放动态内存。邪恶是因为它可能导致上面代码中的错误。
添加构造函数:
~car()
{
delete [] p_name; // Note position of []
}
谢谢大家的回答。没有时间回复问题解决了:)经过一些修改和痛苦:代码:第一个文件
#ifndef YARD_H_INCLUDED
#define YARD_H_INCLUDED
#include "car.h"
#include <iostream>
using namespace std;
class yard
{
private:
int yard_size;
car **car_array;
int cars_in_yard;
public:
yard(int t_yard_size)
{
yard_size=t_yard_size;
car_array= new car *[yard_size];
cars_in_yard=0;
}
~yard()
{
for(int i=0; i<cars_in_yard; i++)
{
delete car_array[i];
}
}
void show() const
{
for (int i=0; i<cars_in_yard; i++)
{
car_array[i]->show();
}
}
int num_Of_cars()
{
return cars_in_yard;
}
void add_car(car *);
void show_last();
bool place();
};
#endif // YARD_H_INCLUDED
yard.h的Cpp
#include "yard.h"
#include "car.h"
void yard::add_car(car *t_car)
{
if (yard_size == cars_in_yard)
{
cout<< "There is no place in a Yard"<<endl;
}
else
{
car_array[cars_in_yard++] = t_car;
cout<<"New car added successfully"<<endl;
}
}
void yard::show_last()
{
car_array[cars_in_yard-1]->show();
}
bool yard::place()
{
if (yard_size==cars_in_yard)
{
cout<<"There is no place in a Yard"<<endl;
return false;
}
else
{
return true;
}
}
最后是car.h
#ifndef CAR_H_INCLUDED
#define CAR_H_INCLUDED
#include <iostream>
using namespace std;
class car
{ private:
char car_name[80];
double price;
int eng;
public:
car()
{
price=0.0;
eng=0;
}
car(char t_car_name[],int t_price, int t_eng)
{
strcat(car_name, t_car_name);
price = t_price;
eng = t_eng;
}
void show()
{
std::cout<<"Car Make : "<< car_name <<" , Price: "<< price<<" $ , Engine : "<< eng <<" cc ."<<std::endl;
}
};
#endif // CAR_H_INCLUDED
相关文章:
- 将对象数组的引用传递给函数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 类对象数组的问题会导致崩溃
- Arduino C++在构造函数中用参数声明对象数组
- 使用对象数组对 SFML 进行动画处理
- C++ 对象数组堆栈溢出
- 如何将对象数组作为参数传递给模板
- 使用向量初始化参数化构造函数的对象数组
- 如何初始化对象数组?
- C++创建对象数组
- 在对象数组中搜索字符串并返回相应值的函数
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- 使用 C++ 创建对象数组
- 对象数组打印空白字符串
- 重载运算符 [] 用于从对象数组中给出特定索引
- 如何在 C++ 中使用提升属性树从 JSON 文件中读取对象数组