Форум программистов, компьютерный форум CyberForum.ru

Создание динамического массива объектов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.82
InferernumDeus
7 / 7 / 1
Регистрация: 13.08.2012
Сообщений: 244
14.11.2012, 14:55     Создание динамического массива объектов #1
Выполняю лабораторную работу в Visual Studio 2012.
Вероятно, учебник, как и лабы, устарел.

Идёт пункт в лабе:
В файле group.h определите с помощью ключевого слова class объект Group.
Данные объекта:
размер массива (целый тип)
указатель на массив (тип Person* )

Записываю:
C++
1
2
int size;
person* pgroup[];
Получаю ошибку с указанием на вторую строку:

"Идентификатор "person" не определён".

Что звучит вполне логично, поскольку данный класс был объявлен, но только в другом .h файле.
Каким образом их можно связать?
Ни в учебнике, ни в тексте лабораторной ничего об этом не сказано.

Кроме того, возникли проблемы при объявлении конструктора этого класса в файле group.cpp.
Впрочем, здесь компилятор объяснит лучше меня.
Прикладываю исходники в архиве.
Вложения
Тип файла: rar LAB2.rar (1.46 Мб, 22 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2012, 14:55     Создание динамического массива объектов
Посмотрите здесь:

Создание динамического массива C++
C++ Создание динамического массива
Создание динамического массива C++
C++ Создание динамического массива
Создание динамического массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
denys_l
51 / 51 / 4
Регистрация: 26.09.2011
Сообщений: 186
14.11.2012, 15:13     Создание динамического массива объектов #2
Оператор индексирования указывать не надо
C++
1
person* pgroup;
связать два фала можно подключив его
C++
1
#include "*.h"
Добавлено через 7 минут
А вообще, в коде очень много синтаксических ошибок
InferernumDeus
7 / 7 / 1
Регистрация: 13.08.2012
Сообщений: 244
15.11.2012, 08:06  [ТС]     Создание динамического массива объектов #3
Спасибо, исправил часть ошибок.
Теперь ругается:
error C2533: Group::{ctor}: конструкторы не разрешены для возвращаемого типа,

при описании конструктора.

Довольно неприятно переходить с php на c++, но ради таких-то возможностей оптимизации стоит потерпеть.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
15.11.2012, 08:22     Создание динамического массива объектов #4
Цитата Сообщение от InferernumDeus Посмотреть сообщение
error C2533: Group::{ctor}: конструкторы не разрешены для возвращаемого типа,
где ругается?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
15.11.2012, 08:28     Создание динамического массива объектов #5
Цитата Сообщение от InferernumDeus Посмотреть сообщение
C2533: Group::{ctor}: конструкторы не разрешены для возвращаемого типа,
ты наверно вот так пишешь
C++
1
2
class Group{
 void/*(int....double)*/ Group()
но конструктор не возвращает значений даже void
посему надо писать так
C++
1
2
class Group{
  Group()
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
15.11.2012, 08:30     Создание динамического массива объектов #6
эта ошибка значит, что у Вас где-то есть конструктор, который имеет возвращаемый тип. У конструктора его быть не должна (даже void'a)
InferernumDeus
7 / 7 / 1
Регистрация: 13.08.2012
Сообщений: 244
15.11.2012, 10:06  [ТС]     Создание динамического массива объектов #7
C++
1
2
public:
    Group(int s);
C++
1
2
3
4
5
Group::Group(int s) //определение конструктора
{
    Group::size = s;
    Group::pgroup = new Person[Group::size];
}
И всё.
Очень странно.
InferernumDeus
7 / 7 / 1
Регистрация: 13.08.2012
Сообщений: 244
15.11.2012, 10:19  [ТС]     Создание динамического массива объектов #8
Всё оказалось проще.
Я забыл очистить решение.

Но теперь получил при компиляции две другие непонятные ошибки.
Прикладываю исходники.
Вложения
Тип файла: rar LAB2.rar (1.47 Мб, 29 просмотров)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
15.11.2012, 10:24     Создание динамического массива объектов #9
У Вас 2 функции main. Одна в person.cpp, другая в group.cpp
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
15.11.2012, 10:29     Создание динамического массива объектов #10
Цитата Сообщение от InferernumDeus Посмотреть сообщение
Group::Group(int s) //определение конструктора
{
Group::size = s;
Group:: pgroup = new Person[Group::size];
}
вот здесь ты обращаешься к членам класса ( а не объекта) а класса как такого не существует, это описание
это все равно, что
C++
1
int=5;
тебе нужно обратится членам объекта класса
C++
1
2
3
4
5
 
{
this->size = s;
this->pgroup = new Person[this->size];
}
this это указатель на текущий объект класса, сам на себя
самому на себя ссылаться глупо, объект и так знает про себя все
посему нормально писать так
C++
1
2
3
4
5
 
{
 size = s;
 pgroup = new Person[size];
}
InferernumDeus
7 / 7 / 1
Регистрация: 13.08.2012
Сообщений: 244
15.11.2012, 10:40  [ТС]     Создание динамического массива объектов #11
Цитата Сообщение от Croessmah Посмотреть сообщение
У Вас 2 функции main. Одна в person.cpp, другая в group.cpp
Ура! Таки скомпилировалось.
Довольно странная ошибка.
Цитата Сообщение от ValeryS Посмотреть сообщение
посему нормально писать так
C++
1
2
3
4
5
 
{
 size = s;
 pgroup = new Person[size];
}
До чего же у нас смятый учебник.
Придётся полистать Хортона.
Большое спасибо.
InferernumDeus
7 / 7 / 1
Регистрация: 13.08.2012
Сообщений: 244
10.12.2012, 08:13  [ТС]     Создание динамического массива объектов #12
Помогите.
Я в полном недоумении от всего этого безобразия с типами.
Вложения
Тип файла: rar LAB2.rar (1.84 Мб, 22 просмотров)
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
10.12.2012, 09:20     Создание динамического массива объектов #13
//заранее объявляю переменные-счётчики
int i, j;
double ctr;
не надо заранее объявлять, надо где используются
вот у тебя
C++
1
2
3
4
5
6
7
void Group::Print() //метод для вывода содержимого каждого элемента массива
{
    for (i = 0; i < gsize; i++)
    {
        GetPerson(i).Print();   //метод Group::GetPerson возвращает элемент 
    }                           //матрицы (экземпляр person) к кторому 
}
сделай так
C++
1
2
3
4
5
6
7
void Group::Print() //метод для вывода содержимого каждого элемента массива
{
    for (int i = 0; i < gsize; i++)
    {
        GetPerson(i).Print();   //метод Group::GetPerson возвращает элемент 
    }                           //матрицы (экземпляр person) к кторому 
}
с глобальными переменными можно получить большие неприятности
InferernumDeus
7 / 7 / 1
Регистрация: 13.08.2012
Сообщений: 244
10.12.2012, 10:32  [ТС]     Создание динамического массива объектов #14
Большое спасибо, впредь буду оъявлять правильно.
Осталось разобраться, почему описанное в цикле создание объектов не ассоциируется с нужным конструктором.
Причём, не смотря на ошибку, программа выполняется и выводит содержимое этих объектов.
InferernumDeus
7 / 7 / 1
Регистрация: 13.08.2012
Сообщений: 244
10.12.2012, 13:19  [ТС]     Создание динамического массива объектов #15
Не подумал.
Напишу так.
Кликните здесь для просмотра всего текста

.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Person
{
    int p_num;
    char name[40];
    bool sex;
    double age;
 
    public: 
    Person(int n, char f[], bool s, double a);
    Person();
}; 
 
class Group
{
    //переменные класса
    int gsize;
    Person *pgroup;
    
    public:
    Group(int s);
    int Group::Size();
    void PutPerson(int i, Person& man);
}
.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Group::Group(int s) //определение конструктора
{
    gsize = s;
    pgroup = new Person[gsize];
}
 
int Group::Size() //метод для определения размера массива
{
    return gsize;
}
 
void Group::PutPerson(int i, Person& man) //метод для занесения объекта Person
{                                         //в i-й элемент массива
    pgroup[i] = man;
}
 
int main()
{
    char names[5][25] = {"A", "B", "C", "D", "E"};
    Group group(5);
    
    for (int i = 0; i < group.Size(); i++)
    {
        group.PutPerson (i, Person (i, names[i][0], false, double(i * 10)));
    }
}

Вроде бы, всё необходимое скопировал.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
10.12.2012, 15:17     Создание динамического массива объектов #16
Цитата Сообщение от InferernumDeus Посмотреть сообщение
pgroup[i] = man;
А где у Person конструктор копирования??
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
10.12.2012, 15:49     Создание динамического массива объектов #17
Цитата Сообщение от ValeryS Посмотреть сообщение
А где у Person конструктор копирования??

Не по теме:

скорее оператор присвоения

InferernumDeus
7 / 7 / 1
Регистрация: 13.08.2012
Сообщений: 244
11.12.2012, 10:15  [ТС]     Создание динамического массива объектов #18
Совершенно запутался с указателями.
По заданию нужно описать функцию void Group::PutPerson(int i, Person& man), которая должна заносит объект man типа Person в i-й элемент массива.
Пишу так, предполагая, что pgroup[i] получает адрес.
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
void Group::PutPerson(int i, Person& man) //метод для занесения объекта Person
{                                         //в i-й элемент массива
    pgroup[i] = man;
}
 
for (int i = 0; i < group.Size(); i++)
{
    Person NewPerson (i, names[i][0], false, double(i * 10));
    group.PutPerson (i, NewPerson);
}

При записи pgroup[i] = &man получаю ошибку.
Объясните, что получает функция при передачи переменной через "Person& man" и как в таком случае правильно занести объект в массив указателей.
Перекопал два учебника. Помню, что читал об этом там, но никак не найду.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2012, 13:04     Создание динамического массива объектов
Еще ссылки по теме:

C++ Создание динамического массива
Изменение размера динамического массива объектов класса C++
C++ Создание динамического массива

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
InferernumDeus
7 / 7 / 1
Регистрация: 13.08.2012
Сообщений: 244
20.12.2012, 13:04  [ТС]     Создание динамического массива объектов #19
Всё, разобрался.
Амперсант был лишним.
Yandex
Объявления
20.12.2012, 13:04     Создание динамического массива объектов
Ответ Создать тему
Опции темы

Текущее время: 21:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru