Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
VN
0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90
1

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

27.01.2013, 00:17. Просмотров 778. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2013, 00:17
Ответы с готовыми решениями:

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

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

Как получить имя файла для дальнейшей работы с этим файлом?
Есть программа в которой используются функции GetOpenFile() и GetSaveFile() для открытия и...

Как скопировать проект в другой проект для дальнейшей работы над новой версией (VS)?
(Visual Studio 2013) Например я сделал один проект, пусть это будет проект версия №1, затем я...

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

13
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 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")
0
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 часов пытаюсь это решить.
Вызывать в цикле первую функцию и статический каунтер туда прописывать это не вариант.
0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
27.01.2013, 12:09 4
у вас в предыдушем варианте было правильней, вам стоит копать в сторону работы с массивом указателей, посидите еще подумайте, по пробуйте сначала понять весь принцип работы двумерных массивов, ведь объект класса, и переменная как число, отличаются только логикой и ни чем больше, вам нужно работать именно с контейнером объектов
1
27.01.2013, 12:09
rangerx
1954 / 1563 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
27.01.2013, 12:11 5
1) Возвращать вам нужно указатель на указатель.
2) Массив a является локальным(после выхода из области видимости он "уничтожается"), поэтому возвращать указатель на него нельзя Чтобы решить эту проблему, в данном случае, можно пометить его как static.
1
Schizorb
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 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;
}
1
rangerx
1954 / 1563 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
27.01.2013, 12:19 7
Цитата Сообщение от VN Посмотреть сообщение
Как освободить память в этом примере?
Для корректной работы с памятью массив указателей придётся создавать с помощью new и освобождать её по тому указателю, который возвращает func(сначала содержимое массива, а затем и сам массив), Но лучше, естественно, использовать std::vector.
1
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 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 которое в привате
0
Issues
432 / 367 / 149
Регистрация: 06.08.2012
Сообщений: 961
27.01.2013, 12:59 9
Цитата Сообщение от Nixy Посмотреть сообщение
ты пытаешься обратится к полю bufer которое в привате
обращение же из метода класса, а у него есть доступ.
1
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 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;
}
0
VN
0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90
27.01.2013, 13:22  [ТС] 11
Всем спасибо. Похоже придется переделывать логику работы программы. Не возвращать а передавать массив в другую функцию.
0
Schizorb
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
27.01.2013, 15:03 12
Цитата Сообщение от Nixy Посмотреть сообщение
нет у него доступа к приватным полям других объектов, а тут именно это и происходит
Почему? Защита же работает на уровне классов, а не объектов? Все нормально должно быть с доступом. Или у вас в самом деле не компилируется?
Цитата Сообщение от Nixy Посмотреть сообщение
f2[i]->~Ex();
Зачем деструктор явно вызывать? Все же delete нужен.
0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
27.01.2013, 16:03 13
Цитата Сообщение от Schizorb Посмотреть сообщение
Почему? Защита же работает на уровне классов, а не объектов? Все нормально должно быть с доступом. Или у вас в самом деле не компилируется?
ну вообщето мы пытаемся обратится к закрытым полям объекта, он нас будет ругать на этапе работы
Цитата Сообщение от Schizorb Посмотреть сообщение
Зачем деструктор явно вызывать? Все же delete нужен.
да разницы особо нету

Добавлено через 2 минуты
Цитата Сообщение от Nixy Посмотреть сообщение
ну вообщето мы пытаемся обратится к закрытым полям объекта, он нас будет ругать на этапе работы
хотя нет,вы правы, я ошибался, думал что приватный доступ и на уровне реализации должен быть обрезан, что былобы логично
0
Schizorb
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
27.01.2013, 16:10 14
Цитата Сообщение от Nixy Посмотреть сообщение
Зачем деструктор явно вызывать? Все же delete нужен.
да разницы особо нету
Есть, память (которую выдели под объект с помощью new) освобождена не будет.
0
27.01.2013, 16:10
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2013, 16:10

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

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

Как реализовать выбор строк таблицы посредством CheckBox для дальнейшей работы с этими строками? (как в phpMyAdmin)
Как реализовать выбор строк таблицы посредством CheckBox для дальнейшей работы с этими строками?...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.