作为另一个类成员的对象数组指针的语法

Syntax of a pointer for array of objects as member of another class

本文关键字:对象 数组 指针 语法 成员 另一个      更新时间:2023-10-16

你好,我有两个定义类的文件。在其中一个,我试图使用指针声明另一个类的类数组,我有一些语法问题,我如何在第一个文件中声明这个?提前谢谢你

第一个文件:

 #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_sizecars_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::stringstd::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