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

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

Войти
Регистрация
Восстановить пароль
 
dailydose
overmind
328 / 108 / 29
Регистрация: 21.07.2016
Сообщений: 539
#1

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

18.08.2016, 11:02. Просмотров 255. Ответов 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++ Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
как вернуть массив и как неявно получить атрибут объекта C++
C++ Как работает деструктор?
C++ Как понимать и как исправить идентификатор "cout" не определен ?
C++ Как определить, сработал ли деструктор класса
C++ Как сделать конструктор и деструктор с параметрами?
C++ Как реализовать деструктор в паттерне Composite?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,336
Завершенные тесты: 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
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
18.08.2016, 11:15     Деструктор неявно определен как удаленный #3
Цитата Сообщение от dailydose Посмотреть сообщение
Выдаёт ошибку если раскомментировать /*std::string varType;*/ ( 22 строка ).
Если у тебя С++11 и выше и ты хочешь хранить в union объекты с нетривиальными конструкторами\деструкторами, то тебе придется написать дополнительный обвес для сохранения информации об истинном типе переменной в union и организовать ручной вызов деструкторов (и конструкторов) в соответствии с этой информацией.
Slip.
71 / 71 / 17
Регистрация: 17.03.2012
Сообщений: 464
Завершенные тесты: 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
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
18.08.2016, 11:17     Деструктор неявно определен как удаленный #5
Цитата Сообщение от Slip. Посмотреть сообщение
можно сделать что-то вроде
Похоже, что оно так и надо.
Если varType - это строковое имя, определяющее какое из полей union активно, то это имя должно быть вне union в любом случае
dailydose
overmind
328 / 108 / 29
Регистрация: 21.07.2016
Сообщений: 539
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.
71 / 71 / 17
Регистрация: 17.03.2012
Сообщений: 464
Завершенные тесты: 1
18.08.2016, 14:37     Деструктор неявно определен как удаленный #7
Цитата Сообщение от dailydose Посмотреть сообщение
А можно тут подробнее? Как понять критична или нет ?
Структура способна хранить все элементы в памяти одновременно. Объединение же хранит в памяти только один элемент в один момент времени. Но эта разница далеко не всегда критична
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2016, 17:25     Деструктор неявно определен как удаленный
Еще ссылки по теме:
C++ Как выглядит конструктор и деструктор для vector ?
Как работает деструктор и конструктор при наследовании? C++
Подскажите как правильно добавить виртуальный деструктор C++
Stl map: Как вызвать деструктор мапа C++
Деструктор класса. Как правильно очистить память? C++

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

Или воспользуйтесь поиском по форуму:
dailydose
overmind
328 / 108 / 29
Регистрация: 21.07.2016
Сообщений: 539
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     Деструктор неявно определен как удаленный
Ответ Создать тему
Опции темы

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