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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
#1

Деструктор неявно определен как удаленный - C++

18.08.2016, 11:02. Просмотров 198. Ответов 7
Метки нет (Все метки)

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
#include <iostream>
#include <windows.h>
#include <string>
 
class Config
{
public:
    Config(std::string fileName)
    {
        /*ifstream f(fileName);
        f.close();*/
    }
    ~Config() {}
 
private:
    struct ammounts
    {
        union types
        {
            int i;
            float f;
            /*std::string varType;*/
        };
    } maxHealth, maxArmour, maxAmmo;
};
 
int main()
{
    Config* cfg = new Config("settings.cfg");
 
    delete cfg;
    return 0;
}
Выдаёт ошибку если раскомментировать /*std::string varType;*/ ( 22 строка ).
Если же str::string varType заменить на char* varType, то всё компилируется прекрасно.

В чём дело? Конфликт пространства имен ???
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2016, 11:02     Деструктор неявно определен как удаленный
Посмотрите здесь:

как вернуть массив и как неявно получить атрибут объекта C++
C++ Как выглядит конструктор и деструктор для vector ?
C++ Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
C++ Как сделать конструктор и деструктор с параметрами?
Деструктор класса. Как правильно очистить память? C++
C++ Как создать удаленный доступ к учетной записи
Stl map: Как вызвать деструктор мапа C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14638 / 6599 / 1045
Регистрация: 02.05.2013
Сообщений: 10,869
Завершенные тесты: 1
18.08.2016, 11:08     Деструктор неявно определен как удаленный #2
В C++98/03 такие типы, как std::string, не могут быть членами union:
9.5 Unions

1.

...

An object of a class with a non-trivial constructor (12.1), a non-trivial copy constructor (12.8), a
non-trivial destructor (12.4), or a non-trivial copy assignment operator (13.5.3, 12.8) cannot
be a member of a union, nor can an array of such objects.
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
18.08.2016, 11:15     Деструктор неявно определен как удаленный #3
Цитата Сообщение от dailydose Посмотреть сообщение
Выдаёт ошибку если раскомментировать /*std::string varType;*/ ( 22 строка ).
Если у тебя С++11 и выше и ты хочешь хранить в union объекты с нетривиальными конструкторами\деструкторами, то тебе придется написать дополнительный обвес для сохранения информации об истинном типе переменной в union и организовать ручной вызов деструкторов (и конструкторов) в соответствии с этой информацией.
Slip.
64 / 64 / 14
Регистрация: 17.03.2012
Сообщений: 445
Завершенные тесты: 1
18.08.2016, 11:17     Деструктор неявно определен как удаленный #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Убежденный Посмотреть сообщение
В C++98/03 такие типы, как std::string, не могут быть членами union:
Зато можно сделать что-то вроде
C++
1
2
3
4
5
6
7
8
9
struct ammounts
    {
        union types
        {
            int i;
            float f;
        };
        std::string varType;
    } maxHealth, maxArmour, maxAmmo;
Если, конечно, память не критична.

Добавлено через 1 минуту
А если сделать указатель на строку?
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
18.08.2016, 11:17     Деструктор неявно определен как удаленный #5
Цитата Сообщение от Slip. Посмотреть сообщение
можно сделать что-то вроде
Похоже, что оно так и надо.
Если varType - это строковое имя, определяющее какое из полей union активно, то это имя должно быть вне union в любом случае
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
18.08.2016, 13:56  [ТС]     Деструктор неявно определен как удаленный #6
Цитата Сообщение от Slip. Посмотреть сообщение
Зато можно сделать что-то вроде
C++
1
2
3
4
5
6
7
8
9
struct ammounts
    {
        union types
        {
            int i;
            float f;
        };
        std::string varType;
    } maxHealth, maxArmour, maxAmmo;
Вот что вышло:
Цитата Сообщение от main.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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <windows.h>
#include <string>
#include <fstream>
 
class Config
{
public:
    Config(std::string fileName)
    {
        std::ifstream f(fileName);
        readFile(f);
        f.close();
    }
    void readFile(std::ifstream&f)
    {
        // getline etc...
        maxHealth.varType = "Float";
        maxHealth.value.f = 150.0;
 
        // getline etc...
        maxArmour.varType = "Float";
        maxArmour.value.f = 250.0;
 
        // getline etc...
        maxAmmo.varType = "Byte";
        maxAmmo.value.i = 60;
    }
    ~Config() {}
 
private:
    struct ammounts
    {
        union types
        {
            int i;
            float f;
        }value;
        std::string varType;
    } maxHealth, maxArmour, maxAmmo;
};
 
int main()
{
    Config* cfg = new Config("settings.cfg");
 
    delete cfg;
    return 0;
}

Цитата Сообщение от DrOffset Посмотреть сообщение
Если varType - это строковое имя, определяющее какое из полей union активно, то это имя должно быть вне union в любом случае
Так и есть

Всем спасибо

Добавлено через 39 секунд
Цитата Сообщение от Slip. Посмотреть сообщение
А если сделать указатель на строку?
Компилятор не ругается.

Добавлено через 1 минуту
Цитата Сообщение от Slip. Посмотреть сообщение
Если, конечно, память не критична.
А можно тут подробнее? Как понять критична или нет ?
Slip.
64 / 64 / 14
Регистрация: 17.03.2012
Сообщений: 445
Завершенные тесты: 1
18.08.2016, 14:37     Деструктор неявно определен как удаленный #7
Цитата Сообщение от dailydose Посмотреть сообщение
А можно тут подробнее? Как понять критична или нет ?
Структура способна хранить все элементы в памяти одновременно. Объединение же хранит в памяти только один элемент в один момент времени. Но эта разница далеко не всегда критична
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2016, 17:25     Деструктор неявно определен как удаленный
Еще ссылки по теме:

C++ Как реализовать деструктор в паттерне Composite?
C++ Как понимать и как исправить идентификатор "cout" не определен ?
Как правильно сохранить структуру, унаследованную от структуры, содержащую виртуальный деструктор? C++
C++ Как работает деструктор?
Как работает деструктор и конструктор при наследовании? C++

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

Или воспользуйтесь поиском по форуму:
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
19.08.2016, 17:25  [ТС]     Деструктор неявно определен как удаленный #8
Цитата Сообщение от Slip. Посмотреть сообщение
Структура способна хранить все элементы в памяти одновременно. Объединение же хранит в памяти только один элемент в один момент времени
в этом как бы и суть union, что он хранит в памяти лишь 1 объект, а так сказать "интерпритироваться" он может по разному
C++
1
2
3
4
union {int i; float f; char c;} someUnion;
someUnion = 'C';
someUnion = 123;
someUnion = 777.7;
Добавлено через 1 минуту
под "А можно тут подробнее? Как понять критична или нет ?" имелась ввиду эта фраза
Цитата Сообщение от Slip. Посмотреть сообщение
Если, конечно, память не критична.
к чему она?
Yandex
Объявления
19.08.2016, 17:25     Деструктор неявно определен как удаленный
Ответ Создать тему
Опции темы

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