Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 20.03.2018
Сообщений: 13
1

Скопировать массив объектов класса

20.03.2018, 00:39. Показов 2140. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не получается скопировать динамический массив объектов класса в статический массив объектов класса:
"нарушение прав доступа при чтении по адресу 0xFFFFFFFFFFFFFFFF."

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <string>
using namespace std;
 
class Addres
{
private:
    const char* name;
    const char* street;
    int house_number;
public:
    Addres() : name("None"), street("None"), house_number(NULL)
    {
        cout << "Конструктор без параметрів викликаний для об'єкта " << this << endl;
    };
    Addres(const char* name, const char* street, const int house_number)
    {
        cout << "Конструктор з параметрами викликаний для об'єкта " << this << endl;
        this->name = name;
    };
    Addres(const Addres &object)
    {
        cout << "Конструктор копіювання викликаний для об'єкта " << this << endl;
        this->name = object.name;
        this->street = object.street;
        this->house_number = object.house_number;
    };
    ~Addres()
    {
        cout << "Деструктор викликаний для об'єкта " << this << endl;
    };
 
    void setName(const char* name)
    {
        this->name = name;
    }
    void setStreet(const char* street)
    {
        this->street = street;
    }
    void setHouseNumber(const int house_number)
    {
        this->house_number = house_number;
    }
 
    const char* getName() { return name; }
    const char* getStreet() { return street; }
    int getHouseNumber() { return house_number; }
 
    string print()
    {
        return "Name: " + string(name) + "\nStreet: " + string(street) + "\nHouse number: " + to_string(house_number);
    }
};
 
int main()
{
    setlocale(LC_ALL, "Ukr");
 
    string(Addres::*ptrPrint)();
    ptrPrint = &Addres::print;
 
    const int LENGHT = 1;
    Addres *dynamicArray = new Addres[LENGHT] { Addres("Yura Franasyuk", "15kvitna", 7) };
    Addres staticArray[LENGHT];
 
    staticArray[0] = dynamicArray[0];
 
    delete[] dynamicArray;
 
    cout << (staticArray[0].*ptrPrint)() << endl << endl;
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2018, 00:39
Ответы с готовыми решениями:

Передача объектов дочерних классов через массив объектов родительского класса в функцию
Здравствуйте. Возможно, вопрос больше относится к теории ООП, но все же я не решился задавать его в...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив...

Массив объектов класса. Печать строк-членов класса.
подскажите, как распечатать строки? #include &quot;myString.h&quot; #include &lt;iostream&gt; #define stop...

Массив объектов класса как член другого класса
Здравствуйте. У меня тут возникла проблемка #include &quot;main.h&quot; class player { public: ...

8
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
20.03.2018, 01:45 2
Цитата Сообщение от Юра Франасюк Посмотреть сообщение
C++
1
2
3
4
5
Addres(const char* name, const char* street, const int house_number)
    {
        cout << "Конструктор з параметрами викликаний для об'єкта " << this << endl;
        this->name = name;
    };
А остальные поля инициализировать?
1
Модератор
Эксперт С++
13502 / 10754 / 6409
Регистрация: 18.12.2011
Сообщений: 28,703
20.03.2018, 08:19 3
В конструкторе
Цитата Сообщение от Юра Франасюк Посмотреть сообщение
this->name = name;
Это грубая ошибка.
1. Константа не обязана обладать свойством static
2. Нельзя насильно заставлять потребителя Вашего класса передавать в конструкторе только константы.
C++
1
/*const*/ char* name;
C++
1
2
this->name=new char[strlen(name)+1];
strcpy(this->name , name);
И не забудьте в деструкторе
C++
1
delete[] name;
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
20.03.2018, 14:27 4
Цитата Сообщение от zss Посмотреть сообщение
Это грубая ошибка.
В данном случае, нет там никакой ошибки. Память в коде не выделяется, операции выполняются с указателями на строковые литералы.
2
Модератор
Эксперт С++
13502 / 10754 / 6409
Регистрация: 18.12.2011
Сообщений: 28,703
20.03.2018, 16:04 5
Цитата Сообщение от nd2 Посмотреть сообщение
на строковые литералы
А есть гарантия, что указатели на них валидны при выходе из функции?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
20.03.2018, 16:20 6
Цитата Сообщение от zss Посмотреть сообщение
А есть гарантия, что указатели на них валидны при выходе из функции?
Как они могут стать невалидными?
0
Модератор
Эксперт С++
13502 / 10754 / 6409
Регистрация: 18.12.2011
Сообщений: 28,703
20.03.2018, 17:29 7
Цитата Сообщение от nd2 Посмотреть сообщение
Как они могут стать невалидными?
C++
1
2
3
4
5
char* f()
{
    const char* txt="abcd";
    return txt;
}
Здесь txt указатель на локальную константу.
Что с ней станется при выходе из функции неизвестно.
Вот если написать
C++
1
    static const char* txt="abcd";
То такой указатель должен сохраняться при выходе из функции.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
20.03.2018, 18:00 8
Цитата Сообщение от zss Посмотреть сообщение
Здесь txt указатель на локальную константу.
С чего бы это? Указатель локальный, это да. Вот такой код попробуй:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const char* f()
{
    const char* txt="abcd";
    cout << hex << (int)txt << endl;
    return txt;
}
 
const char* pg = "abcd";
 
int main()
{  
    cout << hex << (int)pg << endl;
    const char* pc = "abcd";
    cout << hex << (int)pc << endl;
    f();
}
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
20.03.2018, 18:03 9
Цитата Сообщение от zss Посмотреть сообщение
Нельзя насильно заставлять потребителя Вашего класса передавать в конструкторе только константы.
Нельзя насильно заставлять передавать только не-константы.

Цитата Сообщение от zss Посмотреть сообщение
Здесь txt указатель на локальную константу.

Цитата Сообщение от http://eel.is/c++draft/lex.string#16
Evaluating a string-literal results in a string literal object with static storage duration, initialized from the given characters as specified above.
Цитата Сообщение от zss Посмотреть сообщение
Вот если написать


Цитата Сообщение от zss Посмотреть сообщение
То такой указатель должен сохраняться при выходе из функции.
Зачем его вообще сохранять, если нужно только вернуть?
1
20.03.2018, 18:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2018, 18:03
Помогаю со студенческими работами здесь

Написать класс Матрица. Массив объектов класса Массив
Написать класс Матрица (в данном случае матрица – массив объектов класса Массив из предыдущего...

Массив объектов класса
Привет. подскажите, как правильно сделать массив. Код весь скопировал, только начал писать, на...

Массив объектов класса
Всем привет! Я не так давно познакомился с классами в C++, прочитав несколько статей по этой теме...

Массив объектов класса
Здравствуйте, не могу разобраться как записать в массив объекты класса ObjectX. Подскажите...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru