Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
1

Синтаксическая ошибка при инициализации класса

08.12.2015, 09:41. Показов 1420. Ответов 25
Метки нет (Все метки)

Ругается на инициализацию списком
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Cord
{
    int x=0, y=0, z=0;
};
 
class Point
{
public:
    
    Cord tr;
    Point()=delete;
    Point(int a=0, int b=0, int c=0): tr.x(a),tr.y(b), tr.z(c) { cout << "Points created\n"; }
    void Set(int a = 0, int b = 0, int c = 0)
    {
        tr.x = a, tr.y = b, tr.z = c;
    }
    ~Point();
};
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2015, 09:41
Ответы с готовыми решениями:

Ошибка при инициализации элемента класса
Добрый день, Нужна помощь более опытных форумчан, в поиске ошибки. Есть фрагмент кода: ...

Синтаксическая ошибка в разделении класса
pt.h class PrefixTree { struct node; typedef node* pnode; struct node { string...

Ошибка инициализации объекта, конструктором класса
Добрый день. Написал программу. Создание класса (упражнение из книги Дейтеля) &quot;Создайте класс...

Действие для кнопки при инициализации класса
Предположим есть класс Button #include &quot;string.h&quot; class Button { public: Button(); ...

25
7159 / 6134 / 2801
Регистрация: 14.04.2014
Сообщений: 26,455
08.12.2015, 09:44 2
У Cord сделай конструктор и его вызывай.
3
Котовчанин
940 / 480 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
08.12.2015, 09:48 3
anti-k,
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
struct Cord
{
    int x, y, z;
    Cord(int a, int b, int c)
    {
        x = a;
        y = b; 
        c = z;
    }
};
 
class Point
{
public:
    
    Cord tr;
    Point()=delete;
    Point(int a =0 , int b = 0, int c = 0) : tr(a, b, c)
    { 
        std::cout << "Points created\n"; 
    }
    void Set(int a = 0, int b = 0, int c = 0)
    {
        tr.x = a, tr.y = b, tr.z = c;
    }
    ~Point();
};

Ой... Опоздала.
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
08.12.2015, 09:53  [ТС] 4
nmcf, Тамика, Спасибо большое!

Не по теме:

Хорошего вам дня, товарищи!:)

0
Don't worry, be happy
17274 / 10146 / 1963
Регистрация: 27.09.2012
Сообщений: 25,385
Записей в блоге: 1
08.12.2015, 09:54 5
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

http://en.cppreference.com/w/c... ialization
Explanation

Aggregate initialization is a form of list-initialization, which initializes aggregates

An aggregate is an object of the type that is one of the following

array type
class type (typically, struct or union), that has

no private or protected non-static data members
no user-provided constructors (explicitly defaulted or deleted constructors are allowed) (since C++11)
no base classes
no virtual member functions

no default member initializers
Переделываем:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct Cord
{
    int x, y, z;//Убрали инициализацию по-умолчанию
};
 
class Point
{
public:
    
    Cord tr;
    Point()=delete;
    Point(int a=0, int b=0, int c=0): tr{a,b,c} //Теперь в списке инициализации можно инициализировать прям так
    cout << "Points created\n"; }
    void Set(int a = 0, int b = 0, int c = 0)
    {
        tr.x = a, tr.y = b, tr.z = c;
    }
    ~Point();
};
1
Котовчанин
940 / 480 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
08.12.2015, 09:56 6
Цитата Сообщение от anti-k Посмотреть сообщение
Хорошего вам дня, товарищи!
И Вам, коллега.

Croessmah, anti-k, nmcf, ребят, а расскажите что такое
Цитата Сообщение от anti-k Посмотреть сообщение
Point()=delete;
?
0
Don't worry, be happy
17274 / 10146 / 1963
Регистрация: 27.09.2012
Сообщений: 25,385
Записей в блоге: 1
08.12.2015, 09:57 7
Цитата Сообщение от Тамика Посмотреть сообщение
а расскажите что такое
конструктор без параметров не будет генерироваться автоматически, хотя он и так не будет сгенерирован, т.к. есть конструктор, определенный пользователем, так что удалите этот баласт, он Вам будет мешать, если захотите без параметров вызвать конструктор. С одной стороны конструктор без параметров удален, а с другой стороны есть конструктор, который можно использовать без параметров, т.к. они заданы по умолчанию. Вот тут компилятор может загнуться.
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
08.12.2015, 10:14  [ТС] 8
Croessmah,
Лично у меня визуал требует еще
C++
1
Point(int a = 0, int b = 0, int c = 0) : tr{ a,b,c } {};
Во всяком случае я так написал и варнинги убрались.

Добавлено через 6 минут
Тамика, В С это просто помещалось
C++
1
Point()
в private

Добавлено через 4 минуты
Croessmah,
C++
1
2
Point();
    Point(int a=0, int b=0, int c=0): tr{a,b,c}
Но вот так будет ошибка линковки, мне кажется.
1
7159 / 6134 / 2801
Регистрация: 14.04.2014
Сообщений: 26,455
08.12.2015, 12:19 9
Croessmah, эти фигурные скобки не везде работают. В VS 2012 - нет.
1
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.12.2015, 12:56 10
Цитата Сообщение от nmcf Посмотреть сообщение
В VS 2012 - нет.
На дворе 2015 заканчивается uniform initialization ещё не умела тогда студия.
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
08.12.2015, 13:04  [ТС] 11
nmcf, Tulosba, Товарищи офицеры, подскажите пожалуйста, мне нужно запретить в инициализации привидение чара и дабла(вот где мне кажется понадобится =delete). Планирую реализовать
через запрет явной специализации шаблона к этим типам, путь выбрал правильный?
0
Don't worry, be happy
17274 / 10146 / 1963
Регистрация: 27.09.2012
Сообщений: 25,385
Записей в блоге: 1
08.12.2015, 17:48 12
Цитата Сообщение от anti-k Посмотреть сообщение
путь выбрал правильный?
думаю, из Вашей формулировки никто ничего не понял
0
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
08.12.2015, 18:10  [ТС] 13
Croessmah, Не удивительно что не понял никто, я сам не понял
А дело вот в чем, есть объектов с полем, допустим int, мне нужно запретить инициализацию и создание с приведением типов. То есть пресловутый "=delete".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct Cord
{
    ui x, y;
    ui Get_x() { return x; }
    ui Get_y() { return y; }    
    void Print()const { cout << x << " " << " " <<" \n"; }
 
    Cord() 
    {
        cout << "input x\n"; cin >> x;
        cout << "input y\n"; cin >> y;
        cout << "initialized by default\n";
    }
    Cord(double a, double b) = delete;
    Cord(char a, char b) = delete;
    Cord(ui a, ui b) :x(a), y(b) { cout << "created by list\n"; }
    
        
};
Мне кажется удобно было бы сделать template и запретить его специализацию для char и double к примеру.
0
7159 / 6134 / 2801
Регистрация: 14.04.2014
Сообщений: 26,455
08.12.2015, 19:08 14
Какой-то странный эффект от этого delete. Если есть конструктор с int, и при этом запрещаешь double, то в результате так же перестаёт работать float и все целые типы, которые больше по диапазону, чем int.
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
08.12.2015, 19:12  [ТС] 15
nmcf, Странный не то слово. Нужн темплейт для конструктора. Такое возможно? Потому что при реализации VS плюеьбся
0
15370 / 8315 / 2017
Регистрация: 30.01.2014
Сообщений: 14,193
09.12.2015, 08:59 16
Цитата Сообщение от anti-k Посмотреть сообщение
Нужн темплейт для конструктора. Такое возможно?
Да. SFINAE в помощь.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct Coord
{
    ui x, y;
    ui Get_x() { return x; }
    ui Get_y() { return y; }
    void Print()const { cout << x << " " << " " <<" \n"; }
 
    Coord()
    {
        cout << "input x\n"; cin >> x;
        cout << "input y\n"; cin >> y;
        cout << "initialized by default\n";
    }
    template <typename T, typename = typename std::enable_if<std::is_same<T, ui>::value>::type>
    Coord(T a, T b) : x(a), y(b) { cout << "created by list\n"; }
// или если шаблонные параметры "по умолчанию" еще не поддерживаются, то так:
//    template <typename T>
//    Coord(T a, T b, typename std::enable_if<std::is_same<T, ui>::value>::type * = nullptr)
//        : x(a), y(b) { cout << "created by list\n"; }
};
В условии enable_if можно и более сложные проверки сделать, если нужно. Например отсеить все неинтегральные типы или типы, большие заданного размера, и т.п.
2
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.12.2015, 10:47 17
Цитата Сообщение от DrOffset Посмотреть сообщение
SFINAE в помощь.
Или при поддержке concept:
C++
1
2
template <typename T> requires std::is_same<T, ui>::value
Coord(T a, T b) : x(a), y(b) { cout << "created by list\n"; }
Пока только gcc6 поддерживает, емнип.
2
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
09.12.2015, 11:22  [ТС] 18
DrOffset, Tulosba, Спасибо огромное! А не могли бы ли вы глянуть, тут опять таки по поводу конструктора,
C++
1
Vector(int*arr, int n) :mVector(arr), num(n), num_alive(++num_alive) { arr = nullptr; cout << "created"; }
Здесь хочу просто инициализировать вектор другим уже созданным массивом. При попытке опосля удалить массив
крэшит. Очень хочу разобраться почему, подскажите, будьте так любезны.
0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.12.2015, 11:26 19
Цитата Сообщение от anti-k Посмотреть сообщение
При попытке опосля удалить массив крэшит.
Код, приводящий к падению надобно. Пока могу предположить, что просто делаешь delete тому, чему нельзя делать.
0
2546 / 1205 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
09.12.2015, 11:28 20
C++
1
2
3
 
Point()=delete;
Point(int a=0, int b=0, int c=0):
Цитата Сообщение от Croessmah Посмотреть сообщение
С одной стороны конструктор без параметров удален, а с другой стороны есть конструктор, который можно использовать без параметров, т.к. они заданы по умолчанию
И как бы вы отреагировали бы увидим такое в коде? int a = 0; тут излишен.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2015, 11:28

Синтаксическая ошибка при определении массива
Не определяется массив int choiceLevel (); int main () { string answer; int level=...

Синтаксическая ошибка при использовании конструкции ::ssize_t
Скачал официальную библиотеку Image Magick. Добавил в проект. Не компилится, ругается на синтаксис....

Синтаксическая ошибка при создании библиотеки: __declspec(dllimport)
Итак, братья-кролики , создаю я дллку с таким вот кодом , а мне ошибочку все время не понятную...

Ошибка при инициализации
На 3 и 4 строчку показывает отладчик при вылете. BADpixel *enemy; pixel *player; enemy =...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru