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

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

Восстановить пароль Регистрация
 
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
18.08.2016, 11:02     Деструктор неявно определен как удаленный #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
#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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14203 / 6218 / 986
Регистрация: 02.05.2013
Сообщений: 10,366
Завершенные тесты: 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
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
18.08.2016, 11:15     Деструктор неявно определен как удаленный #3
Цитата Сообщение от dailydose Посмотреть сообщение
Выдаёт ошибку если раскомментировать /*std::string varType;*/ ( 22 строка ).
Если у тебя С++11 и выше и ты хочешь хранить в union объекты с нетривиальными конструкторами\деструкторами, то тебе придется написать дополнительный обвес для сохранения информации об истинном типе переменной в union и организовать ручной вызов деструкторов (и конструкторов) в соответствии с этой информацией.
Slip.
46 / 46 / 10
Регистрация: 17.03.2012
Сообщений: 372
Завершенные тесты: 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
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
18.08.2016, 11:17     Деструктор неявно определен как удаленный #5
Цитата Сообщение от Slip. Посмотреть сообщение
можно сделать что-то вроде
Похоже, что оно так и надо.
Если varType - это строковое имя, определяющее какое из полей union активно, то это имя должно быть вне union в любом случае
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
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.
46 / 46 / 10
Регистрация: 17.03.2012
Сообщений: 372
Завершенные тесты: 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++ Как работает деструктор?

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

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

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