Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
dailydose
overmind
409 / 146 / 41
Регистрация: 21.07.2016
Сообщений: 671
#1

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

18.08.2016, 11:02. Просмотров 311. Ответов 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, то всё компилируется прекрасно.

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

Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B - C++
Почему я делаю виртуальным деструктор A, а в таблице виртуальных функций лежит деструктор B?

как вернуть массив и как неявно получить атрибут объекта - C++
хочу спросить как из функции вернуть массив int g(void){ int a; //как-то его заполнить return a; } массив...

Как работает деструктор? - C++
1.Деструктор вызывается когда объект удаляется? ИЛИ 2. Сам деструктор удаляет объект? P.s. Надеюсь понятно))

Как понимать и как исправить идентификатор "cout" не определен ? - C++

Как сделать конструктор и деструктор с параметрами? - C++
как сделать конструктор и деструктор с параметрами?:-| #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class...

Как реализовать деструктор в паттерне Composite? - C++
class Component { public: Component(); virtual ~Component(); // операции выполняемые, как с отдельными объектами ...

7
Убежденный
Ушел с форума
Эксперт С++
15708 / 7218 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 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.
2
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
18.08.2016, 11:15 #3
Цитата Сообщение от dailydose Посмотреть сообщение
Выдаёт ошибку если раскомментировать /*std::string varType;*/ ( 22 строка ).
Если у тебя С++11 и выше и ты хочешь хранить в union объекты с нетривиальными конструкторами\деструкторами, то тебе придется написать дополнительный обвес для сохранения информации об истинном типе переменной в union и организовать ручной вызов деструкторов (и конструкторов) в соответствии с этой информацией.
1
Slip.
78 / 78 / 18
Регистрация: 17.03.2012
Сообщений: 488
Завершенные тесты: 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 минуту
А если сделать указатель на строку?
1
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
18.08.2016, 11:17 #5
Цитата Сообщение от Slip. Посмотреть сообщение
можно сделать что-то вроде
Похоже, что оно так и надо.
Если varType - это строковое имя, определяющее какое из полей union активно, то это имя должно быть вне union в любом случае
1
dailydose
overmind
409 / 146 / 41
Регистрация: 21.07.2016
Сообщений: 671
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. Посмотреть сообщение
Если, конечно, память не критична.
А можно тут подробнее? Как понять критична или нет ?
0
Slip.
78 / 78 / 18
Регистрация: 17.03.2012
Сообщений: 488
Завершенные тесты: 1
18.08.2016, 14:37 #7
Цитата Сообщение от dailydose Посмотреть сообщение
А можно тут подробнее? Как понять критична или нет ?
Структура способна хранить все элементы в памяти одновременно. Объединение же хранит в памяти только один элемент в один момент времени. Но эта разница далеко не всегда критична
1
dailydose
overmind
409 / 146 / 41
Регистрация: 21.07.2016
Сообщений: 671
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. Посмотреть сообщение
Если, конечно, память не критична.
к чему она?
0
19.08.2016, 17:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2016, 17:25
Привет! Вот еще темы с ответами:

Как определить, сработал ли деструктор класса - C++
Пишу класс, пишу деструктор, но как определить, что деструктор сработал? Сам код: class array{ private: int *arr; public: ...

Stl map: Как вызвать деструктор мапа - C++
1) как вызвать деструктор мапа?)) 2) если мап хранит класс он вызовит его деструктор при своём уничтожении?

Подскажите как правильно добавить виртуальный деструктор - C++
Доброго времени суток Подскажите пожалуйста, как правильно добавить виртуальный деструктор в класс Int, Double, String и что он должен...

Как выглядит конструктор и деструктор для vector ? - C++
Есть класс: class table_m { public: vector &lt;Item&gt; table; table_m(); }; Как будет выглядеть для него конструктор и...


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

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

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