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

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

Восстановить пароль Регистрация
 
VN
 Аватар для VN
0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90
27.01.2013, 00:17     Как вернуть массив обьектов для дальнейшей работы с ним? #1
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 ?

Как освободить память в этом примере?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2013, 00:17     Как вернуть массив обьектов для дальнейшей работы с ним?
Посмотрите здесь:

Почему функция не может вернуть массив, но может вернуть структуру содержащий массив? C++
Поместить в массив для дальнейшей обработки время из ячеек Excel C++
C++ Как вернуть массив?
как привильно создать и вызвать конструктор для массив обьектов C++
C++ Как вернуть значение результат работы функции в переменную?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
27.01.2013, 11:06     Как вернуть массив обьектов для дальнейшей работы с ним? #2
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")
VN
 Аватар для VN
0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90
27.01.2013, 11:47  [ТС]     Как вернуть массив обьектов для дальнейшей работы с ним? #3
Вот только массив.
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 часов пытаюсь это решить.
Вызывать в цикле первую функцию и статический каунтер туда прописывать это не вариант.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
27.01.2013, 12:09     Как вернуть массив обьектов для дальнейшей работы с ним? #4
у вас в предыдушем варианте было правильней, вам стоит копать в сторону работы с массивом указателей, посидите еще подумайте, по пробуйте сначала понять весь принцип работы двумерных массивов, ведь объект класса, и переменная как число, отличаются только логикой и ни чем больше, вам нужно работать именно с контейнером объектов
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
27.01.2013, 12:11     Как вернуть массив обьектов для дальнейшей работы с ним? #5
1) Возвращать вам нужно указатель на указатель.
2) Массив a является локальным(после выхода из области видимости он "уничтожается"), поэтому возвращать указатель на него нельзя Чтобы решить эту проблему, в данном случае, можно пометить его как static.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
27.01.2013, 12:14     Как вернуть массив обьектов для дальнейшей работы с ним? #6
Как вариант - динамический массив указателей.
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;
}
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
27.01.2013, 12:19     Как вернуть массив обьектов для дальнейшей работы с ним? #7
Цитата Сообщение от VN Посмотреть сообщение
Как освободить память в этом примере?
Для корректной работы с памятью массив указателей придётся создавать с помощью new и освобождать её по тому указателю, который возвращает func(сначала содержимое массива, а затем и сам массив), Но лучше, естественно, использовать std::vector.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
27.01.2013, 12:52     Как вернуть массив обьектов для дальнейшей работы с ним? #8
а еще у тебя не будет работать программа из за вот этой строки
C++
1
2
for(int i = 0; i < 3; i++)
        std::cout << f2[i] -> bufer << std::endl;
ты пытаешься обратится к полю bufer которое в привате
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
27.01.2013, 12:59     Как вернуть массив обьектов для дальнейшей работы с ним? #9
Цитата Сообщение от Nixy Посмотреть сообщение
ты пытаешься обратится к полю bufer которое в привате
обращение же из метода класса, а у него есть доступ.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
27.01.2013, 13:09     Как вернуть массив обьектов для дальнейшей работы с ним? #10
Цитата Сообщение от 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;
}
VN
 Аватар для VN
0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90
27.01.2013, 13:22  [ТС]     Как вернуть массив обьектов для дальнейшей работы с ним? #11
Всем спасибо. Похоже придется переделывать логику работы программы. Не возвращать а передавать массив в другую функцию.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
27.01.2013, 15:03     Как вернуть массив обьектов для дальнейшей работы с ним? #12
Цитата Сообщение от Nixy Посмотреть сообщение
нет у него доступа к приватным полям других объектов, а тут именно это и происходит
Почему? Защита же работает на уровне классов, а не объектов? Все нормально должно быть с доступом. Или у вас в самом деле не компилируется?
Цитата Сообщение от Nixy Посмотреть сообщение
f2[i]->~Ex();
Зачем деструктор явно вызывать? Все же delete нужен.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
27.01.2013, 16:03     Как вернуть массив обьектов для дальнейшей работы с ним? #13
Цитата Сообщение от Schizorb Посмотреть сообщение
Почему? Защита же работает на уровне классов, а не объектов? Все нормально должно быть с доступом. Или у вас в самом деле не компилируется?
ну вообщето мы пытаемся обратится к закрытым полям объекта, он нас будет ругать на этапе работы
Цитата Сообщение от Schizorb Посмотреть сообщение
Зачем деструктор явно вызывать? Все же delete нужен.
да разницы особо нету

Добавлено через 2 минуты
Цитата Сообщение от Nixy Посмотреть сообщение
ну вообщето мы пытаемся обратится к закрытым полям объекта, он нас будет ругать на этапе работы
хотя нет,вы правы, я ошибался, думал что приватный доступ и на уровне реализации должен быть обрезан, что былобы логично
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2013, 16:10     Как вернуть массив обьектов для дальнейшей работы с ним?
Еще ссылки по теме:

Взять текст из текстового файла и поместить его в массив для дальнейшей обработки массива C++
C++ Реализовать стек и 3 оператора для работы с ним
C++ Есть массив в виде табличных данных, как его поделить на отдельные элементы для дальнейшей работы?

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

Или воспользуйтесь поиском по форуму:
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
27.01.2013, 16:10     Как вернуть массив обьектов для дальнейшей работы с ним? #14
Цитата Сообщение от Nixy Посмотреть сообщение
Зачем деструктор явно вызывать? Все же delete нужен.
да разницы особо нету
Есть, память (которую выдели под объект с помощью new) освобождена не будет.
Yandex
Объявления
27.01.2013, 16:10     Как вернуть массив обьектов для дальнейшей работы с ним?
Ответ Создать тему
Опции темы

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