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

Приватный конструктор и стандартный контейнер. Два барана на мосту - C++

Восстановить пароль Регистрация
 
icpu
 Аватар для icpu
276 / 181 / 36
Регистрация: 10.03.2011
Сообщений: 863
Записей в блоге: 2
29.08.2013, 21:49     Приватный конструктор и стандартный контейнер. Два барана на мосту #1
Всем суп!
Итак, банальная вещь - в заголовке - не желает компилироваться. Суть, немного упрощённая, такова:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class AAA {
   private:
      const int ci;
      AAA();
   public:
      AAA(int c):ci(c);
      AAA(const AAA&);
      AAA& operator=(const AAA&);
   }
class BBB {
   private:
      std::map <int,AAA> AAAmap;
   public:
      c(){};
      int foo(int k,int c)
         {
         AAA wut(c);
         AAAmap[k]=wut;
         };
   }
При этом компилятор ругается:
C++
1
2
error C2248: AAA::AAA: невозможно обратиться к private член, объявленному в классе "AAA"
E:\Program Files\Microsoft Visual Studio 10.0\VC\include\map
Что для меня весьма странно, ведь явно я его ни разу не вызывал. Чего не так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2013, 21:49     Приватный конструктор и стандартный контейнер. Два барана на мосту
Посмотрите здесь:

shared_ptr и приватный деструктор C++
C++ Конструктор принимающий два целочисленных значения
Приватный конструктор и деструктор C++
Конструктор вызывается один раз, а деструктор два раза C++
Класс как стандартный контейнер C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
29.08.2013, 21:53     Приватный конструктор и стандартный контейнер. Два барана на мосту #2
Цитата Сообщение от icpu Посмотреть сообщение
Что для меня весьма странно, ведь явно я его ни разу не вызывал
Значит operator [] у map вызывает. Попробуй insert или emplace.
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
29.08.2013, 21:56     Приватный конструктор и стандартный контейнер. Два барана на мосту #3
Цитата Сообщение от icpu Посмотреть сообщение
Что для меня весьма странно, ведь явно я его ни разу не вызывал. Чего не так?
А неявный вызов при конструировании объекта класса внутри контейнера не в счет? Нет тут ничего странного.
icpu
 Аватар для icpu
276 / 181 / 36
Регистрация: 10.03.2011
Сообщений: 863
Записей в блоге: 2
29.08.2013, 22:00  [ТС]     Приватный конструктор и стандартный контейнер. Два барана на мосту #4
Цитата Сообщение от gray_fox Посмотреть сообщение
Значит operator [] у map вызывает. Попробуй insert или emplace.
Ноуп. Не работает.
Цитата Сообщение от BRcr Посмотреть сообщение
А неявный вызов при конструировании объекта класса внутри контейнера не в счет? Нет тут ничего странного.
И щито делать, если не помогает явное создание конструктора копирования?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
29.08.2013, 22:06     Приватный конструктор и стандартный контейнер. Два барана на мосту #5
Цитата Сообщение от icpu Посмотреть сообщение
Ноуп. Не работает.
Держи: http://ideone.com/2YrSWM
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
29.08.2013, 22:21     Приватный конструктор и стандартный контейнер. Два барана на мосту #6
Цитата Сообщение от icpu Посмотреть сообщение
Что для меня весьма странно, ведь явно я его ни разу не вызывал. Чего не так?
ты не вызывал конструктор вызывает
пытается выделить память под объект AAA
может даже здесь
Цитата Сообщение от icpu Посмотреть сообщение
AAA wut(c);
а у тебя стоит неинициализированая приватная константа
Цитата Сообщение от icpu Посмотреть сообщение
private:
const int ci;
что ты с ней собираешься делать
присвоить значение нельзя, константа все таки

она тебе точно нужна?
icpu
 Аватар для icpu
276 / 181 / 36
Регистрация: 10.03.2011
Сообщений: 863
Записей в блоге: 2
29.08.2013, 22:23  [ТС]     Приватный конструктор и стандартный контейнер. Два барана на мосту #7
На сферическом примере в вакууме работает, но всё оказалось хуже. Не может подобрать подходящий конструктор для operator[]
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
29.08.2013, 22:25     Приватный конструктор и стандартный контейнер. Два барана на мосту #8
Цитата Сообщение от icpu Посмотреть сообщение
Не может подобрать подходящий конструктор для operator[]
покажи как конструктор копирования реализовал?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
29.08.2013, 22:26     Приватный конструктор и стандартный контейнер. Два барана на мосту #9
Цитата Сообщение от icpu Посмотреть сообщение
Не может подобрать подходящий конструктор для operator[]
Ну так не используй его )
icpu
 Аватар для icpu
276 / 181 / 36
Регистрация: 10.03.2011
Сообщений: 863
Записей в блоге: 2
29.08.2013, 22:28  [ТС]     Приватный конструктор и стандартный контейнер. Два барана на мосту #10
Цитата Сообщение от ValeryS Посмотреть сообщение
может даже здесь
Ну, если он не может понять, какой из одного доступного конструктора выбрать...
Цитата Сообщение от ValeryS Посмотреть сообщение
она тебе точно нужна?
С ней будет раз в 300 спокойнее, но раз уж такая пляска пошла, то могу и отказаться. Люди, вон, от рук отказываются, чтобы выжить. Уж const 1 переживу.

Но, вообще, это ОЧЕНЬ ТУПО, уже созданный объект запихивать в контейнер не с помощью копирующего конструктора, а с помощью отвёртки. =\
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
29.08.2013, 22:32     Приватный конструктор и стандартный контейнер. Два барана на мосту #11
Цитата Сообщение от icpu Посмотреть сообщение
С ней будет раз в 300 спокойнее,
как ты собираешься присвоить ей значение?
если тебе не нужно чтобы кто то менял
то сделай её приват, что ты и сделал
и не одна стерлядь снаружи не достучится
а в своем классе уж разберись чтобы не испохабить
например присваивать только в конструкторе
icpu
 Аватар для icpu
276 / 181 / 36
Регистрация: 10.03.2011
Сообщений: 863
Записей в блоге: 2
29.08.2013, 22:35  [ТС]     Приватный конструктор и стандартный контейнер. Два барана на мосту #12
По вопросам.
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
class _Map{
    private:
        short int island;
    public:
        _MapIsland(short int);
        _Map(const _MapIsland &);
        _Map & operator = (const _Map &);
 
        int Load (ic);
        int Save ();
    };
 
_Map::_Map(short int i):island(i)   {}
_Map::_Map( const _Map & mi):island(mi.island){}
 
_Map & _Map::operator=( const _Map & mi){
    island = mi.island;
    return *this;
    }
 
class WorldMap  {
    private:
        std::map < short int, _Map > islands;
        short int currentisland;
    public:
        WorldMap();
 
        int Load(short int, IslandCoordinates);
    };
 
WorldMap::WorldMap()    {currentisland = 0;}
 
int WorldMap::Load( short int isl, IslandCoordinates ic){
    islands.insert(std::make_pair(isl,_Map(isl)));
    islands[isl].Load(ic);  }
ValeryS, Так то оно так. Но, если есть такая возможность, почему её нельзя просто брать и использовать? Мне просто не понятно, почему не происходит вызов нужного конструктора.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
29.08.2013, 22:47     Приватный конструктор и стандартный контейнер. Два барана на мосту #13
Цитата Сообщение от icpu Посмотреть сообщение
Мне просто не понятно, почему не происходит вызов нужного конструктора.
сдается мне именно из за константы
конструктор копирования пытается присвоить ей значение а это низя
Цитата Сообщение от icpu Посмотреть сообщение
AAA::AAA: невозможно обратиться к private член, объявленному в классе "AAA"
хотя могу ошибаться, нужно стандарт смотреть а у меня его под рукой нет
попробуй удалить const
если все в порядке будет то дело в ней, если нет то будем дальше смотреть
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
29.08.2013, 22:48     Приватный конструктор и стандартный контейнер. Два барана на мосту #14
Цитата Сообщение от ValeryS Посмотреть сообщение
конструктор копирования пытается присвоить ей значение а это низя
Почему присвоить? Там будет инициализация. operator = - да, нельзя.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
29.08.2013, 22:55     Приватный конструктор и стандартный контейнер. Два барана на мосту #15
Цитата Сообщение от gray_fox Посмотреть сообщение
Почему присвоить? Там будет инициализация.
ты точно уверен? я нет
C++
1
2
const int i;
i=5;
так делать нельзя
а вот так
C++
1
2
3
4
5
6
class A
{
  const int a;
   A(){ a=5;};
   A(const A & b){a=b.a;}
}
я не уверен
говорю же
Цитата Сообщение от ValeryS Посмотреть сообщение
нужно стандарт смотреть а у меня его под рукой нет
icpu
 Аватар для icpu
276 / 181 / 36
Регистрация: 10.03.2011
Сообщений: 863
Записей в блоге: 2
29.08.2013, 22:56  [ТС]     Приватный конструктор и стандартный контейнер. Два барана на мосту #16
Сдаётся мне, что всё дело в
C++
1
islands[isl].Load(ic);
Константа нормально кушалась, а вот operator[] портил воздух.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
29.08.2013, 22:58     Приватный конструктор и стандартный контейнер. Два барана на мосту #17
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
A(const A & b){a=b.a;}
Тут присваивание потому что. Инициализировать надо в списке инициализации:
C++
1
A(const A & b) : a(b.a) {}
Добавлено через 50 секунд
Цитата Сообщение от ValeryS Посмотреть сообщение
A(){ a=5;}
Так кстати тоже не получиться.
icpu
 Аватар для icpu
276 / 181 / 36
Регистрация: 10.03.2011
Сообщений: 863
Записей в блоге: 2
29.08.2013, 22:59  [ТС]     Приватный конструктор и стандартный контейнер. Два барана на мосту #18
ValeryS, я же писал, что конструктор правильный: class A {... A(int _a):a(_a){}; }
А решение простое: использовать std::map::at()
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
29.08.2013, 23:09     Приватный конструктор и стандартный контейнер. Два барана на мосту #19
Цитата Сообщение от icpu Посмотреть сообщение
я же писал, что конструктор правильный: class A {... A(int _a):a(_a){}; }
где?
в первом сообщении вообще реализации нет
в 12 сообщении нет const
Цитата Сообщение от gray_fox Посмотреть сообщение
Так кстати тоже не получиться.
благодарствую
подзабыл малеха
не так часто пользуюсь константами, тем более в классе
не вижу преимуществ
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2013, 23:15     Приватный конструктор и стандартный контейнер. Два барана на мосту
Еще ссылки по теме:

Стандартный векторный контейнер C++
C++ Вызовется ли приватный деструктор?
C++ Стандартный конструктор копировщик и оператор = не справляются со своей задачей

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

Или воспользуйтесь поиском по форуму:
gray_fox
29.08.2013, 23:15     Приватный конструктор и стандартный контейнер. Два барана на мосту
  #20

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
не так часто пользуюсь константами, тем более в классе
не вижу преимуществ
Я не вижу смысла делать изменяемым то, что не изменяемо )

Yandex
Объявления
29.08.2013, 23:15     Приватный конструктор и стандартный контейнер. Два барана на мосту
Ответ Создать тему
Опции темы

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