Синтаксис указателя на массив объектов как члена другого класса

Привет, у меня есть два файла, которые определяют классы. В одном из них я пытаюсь объявить массив классов другого класса с помощью указателя, у меня есть некоторые проблемы с синтаксисом, как я объявляю это в первом файле? заранее спасибо

первый файл:

#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'
</iostream>

второй:

#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];
 ****** 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'
</string></stdlib.h></iostream>
3 ответа

ну спасибо всем, кто ответил.. не успел ответить Проблема решена :) после некоторых изменений и боли: code: first file

#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;="" 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
</cars_in_yard;></iostream>

Cpp of yard.h

#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;>
<p> и, наконец, car.h</p> <pre class="prettyprint linenums">#ifndef CAR_H_INCLUDED #define CAR_H_INCLUDED #include <iostream> using namespace std; class car { private: char car_name[80]; ****** 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 ."<</iostream></pre><code>


car *car_array[]; является синтаксической ошибкой. Размер массива должен быть известен во время компиляции. Чтобы использовать размер времени выполнения, вам необходимо использовать динамическое распределение памяти.

Основано на деструкторе Yard; кажется, что автомобили в этом массиве должны "принадлежать" к Ярду, т.е. Двор отвечает за их очистку.

Было бы проще, если бы в магазине Yard был массив car, вместо того, чтобы хранить массив car *. Но я предполагаю, что вы решили сохранить массив car * вместо этого.

Конечно, самый простой способ сделать это: std::vector<car*> car_array;</car*> (или, возможно, вектор unique_ptr). Однако, поскольку вы должны изобретать велосипед, вам нужно сделать следующее:

  • car **car_array;
  • В конструкторах инициализируйте это (возможно, до nullptr)
  • make 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 []
 }

licensed under cc by-sa 3.0 with attribution.