Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
VN
 Аватар для VN
0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90

Как вернуть массив обьектов для дальнейшей работы с ним?

27.01.2013, 00:17. Показов 1347. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
class Ex
{
public:
    Ex(char *);//конструктор
    ~Ex();//деструктор (пока не используется)
    Ex *func();
    void func2();
private:
 char * bufer;
 
};
Ex::Ex(char * P=""):bufer(P){};//конструктор
Ex::~Ex(){bufer="";};//деструктор (пока не используется)
Ex *Ex::func()
{
        Ex *a[3]={
             new Ex("one"),
             new Ex("two"),
             new Ex("three"),
            };
    for(int i=0 ;i < 3; i++)
       std::cout<<a[i]->bufer<<std::endl;
    return *a;
}
void Ex::func2()
{
    Ex f1,*f2;
    f2=f1.func();
    std::cout<<"func2()"<<std::endl;
    for(int i=0;i<3;i++)
        std::cout<<f2->bufer<<std::endl;//Вот тут не знаю как сделать
}
 
int main()
{
    Ex Call;
    Call.func2();
return 0;
}
Как сделать что бы в func2() напечатолось one two three ?

Как освободить память в этом примере?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.01.2013, 00:17
Ответы с готовыми решениями:

Массив обьектов (для дальнейшей инициализации ) внутри класса
Добрый день, такой вопрос, как можно на питоне создать класс &quot;магазин&quot;, внутри которого будет находиться массив. После того как мы...

Распарсить уравнение из файла (строки), для дальнейшей работы с ним
Доброго времени суток, уже битый час пытаюсь найти готовый или реализовать свой метод позволяющий из файла достать формулу, для дальнейшей...

Есть массив в виде табличных данных, как его поделить на отдельные элементы для дальнейшей работы?
Есть массив в виде табличных данных,как его поделить на отдельные элементы для работы дальше?строка разделена &quot;;&quot;,нужен кусочек...

13
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
27.01.2013, 11:06
C++
1
2
3
4
5
Ex *a[3]={
             new Ex("one"),
             new Ex("two"),
             new Ex("three"),
            };
тут у вас не массив объектов, а массив указателей на объекты, разные веши,копайте в эту сторону

Добавлено через 3 минуты
C++
1
return *a;
и вернется тут не что иное как указатель на первый объект, так как а хранит в себе указатель на нулевую ячейку массива, в которой лежит указатель на объект Ex("one")
0
VN
 Аватар для VN
0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90
27.01.2013, 11:47  [ТС]
Вот только массив.
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
class Ex
{
public:
    Ex(char *);//конструктор
    ~Ex();//деструктор (пока не используется)
    Ex *func();
    void func2();
private:
 char * bufer;
 
};
Ex::Ex(char * P=""):bufer(P){};//конструктор
Ex::~Ex(){bufer="";};//деструктор (пока не используется)
Ex *Ex::func()
{
        Ex a[3]={
                   {("one")},
                   {("two")},
                   {("three")},
            };
    for(int i=0 ;i < 3; i++)
       std::cout<<a[i].bufer<<std::endl;
    return a;
}
void Ex::func2()
{
    Ex f1,*f2;
    f2=f1.func();
    std::cout<<"func2()"<<std::endl;
    for(int i=0;i<3;i++)
        std::cout<<f2->bufer<<std::endl;//Вот тут не знаю как сделать
}
 
int main()
{
    Ex Call;
    Call.func2();
return 0;
}
Здесь вообще только физичиский адресс во вторую функцию получается вернуть.
Мне почти без разницы с чем работать можно с массивом указателей на объекты,можно только с массивом,
Разницы только с проблемой освобождения памяти.
Главное то что доступен только первый обьект остальные нет. И никак с ними не выходит работать. Я уже больше 12 часов пытаюсь это решить.
Вызывать в цикле первую функцию и статический каунтер туда прописывать это не вариант.
0
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
27.01.2013, 12:09
у вас в предыдушем варианте было правильней, вам стоит копать в сторону работы с массивом указателей, посидите еще подумайте, по пробуйте сначала понять весь принцип работы двумерных массивов, ведь объект класса, и переменная как число, отличаются только логикой и ни чем больше, вам нужно работать именно с контейнером объектов
1
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
27.01.2013, 12:11
1) Возвращать вам нужно указатель на указатель.
2) Массив a является локальным(после выхода из области видимости он "уничтожается"), поэтому возвращать указатель на него нельзя Чтобы решить эту проблему, в данном случае, можно пометить его как static.
1
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
27.01.2013, 12:14
Как вариант - динамический массив указателей.
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <cstring>
 
class Ex
{
public:
    Ex(const char *);//конструктор
    ~Ex();//деструктор
    Ex ** func();
    void func2();
private:
    char * bufer;
 
};
Ex::Ex(const char * P = "")
{
    bufer = new char [strlen(P) + 1];
    strcpy(bufer, P);
}//конструктор
 
Ex::~Ex()
{
    delete [] bufer;
};//деструктор
 
Ex ** Ex::func()
{
    Ex ** a = new Ex * [3];
    
    a[0] = new Ex("one");
    a[1] = new Ex("two");
    a[2] = new Ex("three");
   
    for(int i = 0; i < 3; i++)
       std::cout<<a[i]->bufer<<std::endl;
       
    return a;
}
 
void Ex::func2()
{
    Ex f1, **f2;
    f2 = f1.func();
    std::cout << "func2()" << std::endl;
    for(int i = 0; i < 3; i++)
        std::cout << f2[i] -> bufer << std::endl;
    
    for(int i = 0; i < 3; i++)
        delete  f2[i];
    delete [] f2;
}
 
int main()
{
    Ex Call;
    Call.func2();
    return 0;
}
1
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
27.01.2013, 12:19
Цитата Сообщение от VN Посмотреть сообщение
Как освободить память в этом примере?
Для корректной работы с памятью массив указателей придётся создавать с помощью new и освобождать её по тому указателю, который возвращает func(сначала содержимое массива, а затем и сам массив), Но лучше, естественно, использовать std::vector.
1
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
27.01.2013, 12:52
а еще у тебя не будет работать программа из за вот этой строки
C++
1
2
for(int i = 0; i < 3; i++)
        std::cout << f2[i] -> bufer << std::endl;
ты пытаешься обратится к полю bufer которое в привате
0
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
27.01.2013, 12:59
Цитата Сообщение от Nixy Посмотреть сообщение
ты пытаешься обратится к полю bufer которое в привате
обращение же из метода класса, а у него есть доступ.
1
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
27.01.2013, 13:09
Цитата Сообщение от SeregaC++ Посмотреть сообщение
обращение же из метода класса, а у него есть доступ.
нет у него доступа к приватным полям других объектов, а тут именно это и происходит

Добавлено через 1 минуту
Цитата Сообщение от rangerx Посмотреть сообщение
2) Массив a является локальным(после выхода из области видимости он "уничтожается"), поэтому возвращать указатель на него нельзя Чтобы решить эту проблему, в данном случае, можно пометить его как static.
а я думаю , чтож это он удаляется после одного обращения к нему, спасибо

Добавлено через 5 минут
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include "limits.h"
#include <iostream>
using namespace std;
 
class Ex
{
public:
    Ex(char *);//конструктор
    ~Ex();//деструктор (пока не используется)
    Ex **func();
    void func2();
    char* getBuf(){return bufer;};
private:
 char * bufer;
 
};
Ex::Ex(char * P=""):bufer(P){};//конструктор
Ex::~Ex(){cout << "destroy " << bufer<< endl;};//деструктор (пока не используется)
Ex **Ex::func()
{
        static Ex *a[3]={
             new Ex("one"),
             new Ex("two"),
             new Ex("three"),
            };
    for(int i=0 ;i < 3; i++)
       std::cout<<a[i]->bufer<<std::endl;
    return a;
}
void Ex::func2()
{
    std::cout<<"func2()"<<std::endl;
    Ex f1,**f2;
    f2=f1.func();
    for(int i=0;i<3;i++){
        cout<<f2[i]->getBuf()<<endl;
        f2[i]->~Ex();
    }
}
 
int main()
{
    Ex Call;
    Call.func2();
    cout << "in main() " <<endl;
    return 0;
}
0
VN
 Аватар для VN
0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90
27.01.2013, 13:22  [ТС]
Всем спасибо. Похоже придется переделывать логику работы программы. Не возвращать а передавать массив в другую функцию.
0
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
27.01.2013, 15:03
Цитата Сообщение от Nixy Посмотреть сообщение
нет у него доступа к приватным полям других объектов, а тут именно это и происходит
Почему? Защита же работает на уровне классов, а не объектов? Все нормально должно быть с доступом. Или у вас в самом деле не компилируется?
Цитата Сообщение от Nixy Посмотреть сообщение
f2[i]->~Ex();
Зачем деструктор явно вызывать? Все же delete нужен.
0
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
27.01.2013, 16:03
Цитата Сообщение от Schizorb Посмотреть сообщение
Почему? Защита же работает на уровне классов, а не объектов? Все нормально должно быть с доступом. Или у вас в самом деле не компилируется?
ну вообщето мы пытаемся обратится к закрытым полям объекта, он нас будет ругать на этапе работы
Цитата Сообщение от Schizorb Посмотреть сообщение
Зачем деструктор явно вызывать? Все же delete нужен.
да разницы особо нету

Добавлено через 2 минуты
Цитата Сообщение от Nixy Посмотреть сообщение
ну вообщето мы пытаемся обратится к закрытым полям объекта, он нас будет ругать на этапе работы
хотя нет,вы правы, я ошибался, думал что приватный доступ и на уровне реализации должен быть обрезан, что былобы логично
0
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
27.01.2013, 16:10
Цитата Сообщение от Nixy Посмотреть сообщение
Зачем деструктор явно вызывать? Все же delete нужен.
да разницы особо нету
Есть, память (которую выдели под объект с помощью new) освобождена не будет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.01.2013, 16:10
Помогаю со студенческими работами здесь

Отчистить битмап от существующей графики с возможностью дальнейшей с ним работы
Доброго времени суток, товарищи программисты. :drink: Предо мной встала задачка следующего рода: мне нужно отчистить битмап от...

Считать числа из файла в массив для дальнейшей работы с ними
дан файл, в котором записаны данные: X 1 2 35 41 5 63 7 80 нужно считать ЧИСЛА из файла в массив для работы с ними. Никак не...

Массив: Приложение по составлению списков товаров для дальнейшей работы с этим списком
Всем добрый день. Недавно начал изучать Vue.js. Фреймворк очень понравился. На данный момент создаю приложение по составлению...

Как спланировать обучение для дальнейшей работы в SEO ?
Решил полностью поменять область деятельности и углубиться в изучении и практике поискового маркетинга. В будущем хочу устроиться на работу...

Как можно получить данные из файла .dot для дальнейшей работы
Здравствуйте, уважаемые! Помогите пожалуйста! Как можно выцепить данные из файла .dot для дальнейшей работы с ними в программе? Те данные,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru