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

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

Войти
Регистрация
Восстановить пароль
 
 
icpu
321 / 226 / 43
Регистрация: 10.03.2011
Сообщений: 1,091
Записей в блоге: 2
#1

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

29.08.2013, 21:49. Просмотров 691. Ответов 19
Метки нет (Все метки)

Всем суп!
Итак, банальная вещь - в заголовке - не желает компилироваться. Суть, немного упрощённая, такова:
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     Приватный конструктор и стандартный контейнер. Два барана на мосту
Посмотрите здесь:
Приватный конструктор и деструктор C++
Стандартный векторный контейнер C++
Класс как стандартный контейнер C++
C++ Struct (есть ли стандартный конструктор)
C++ Стандартный конструктор копировщик и оператор = не справляются со своей задачей
C++ Конструктор принимающий два целочисленных значения
Конструктор вызывается один раз, а деструктор два раза C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
29.08.2013, 21:53     Приватный конструктор и стандартный контейнер. Два барана на мосту #2
Цитата Сообщение от icpu Посмотреть сообщение
Что для меня весьма странно, ведь явно я его ни разу не вызывал
Значит operator [] у map вызывает. Попробуй insert или emplace.
BRcr
4007 / 2296 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
29.08.2013, 21:56     Приватный конструктор и стандартный контейнер. Два барана на мосту #3
Цитата Сообщение от icpu Посмотреть сообщение
Что для меня весьма странно, ведь явно я его ни разу не вызывал. Чего не так?
А неявный вызов при конструировании объекта класса внутри контейнера не в счет? Нет тут ничего странного.
icpu
321 / 226 / 43
Регистрация: 10.03.2011
Сообщений: 1,091
Записей в блоге: 2
29.08.2013, 22:00  [ТС]     Приватный конструктор и стандартный контейнер. Два барана на мосту #4
Цитата Сообщение от gray_fox Посмотреть сообщение
Значит operator [] у map вызывает. Попробуй insert или emplace.
Ноуп. Не работает.
Цитата Сообщение от BRcr Посмотреть сообщение
А неявный вызов при конструировании объекта класса внутри контейнера не в счет? Нет тут ничего странного.
И щито делать, если не помогает явное создание конструктора копирования?
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
29.08.2013, 22:06     Приватный конструктор и стандартный контейнер. Два барана на мосту #5
Цитата Сообщение от icpu Посмотреть сообщение
Ноуп. Не работает.
Держи: http://ideone.com/2YrSWM
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,732
29.08.2013, 22:21     Приватный конструктор и стандартный контейнер. Два барана на мосту #6
Цитата Сообщение от icpu Посмотреть сообщение
Что для меня весьма странно, ведь явно я его ни разу не вызывал. Чего не так?
ты не вызывал конструктор вызывает
пытается выделить память под объект AAA
может даже здесь
Цитата Сообщение от icpu Посмотреть сообщение
AAA wut(c);
а у тебя стоит неинициализированая приватная константа
Цитата Сообщение от icpu Посмотреть сообщение
private:
const int ci;
что ты с ней собираешься делать
присвоить значение нельзя, константа все таки

она тебе точно нужна?
icpu
321 / 226 / 43
Регистрация: 10.03.2011
Сообщений: 1,091
Записей в блоге: 2
29.08.2013, 22:23  [ТС]     Приватный конструктор и стандартный контейнер. Два барана на мосту #7
На сферическом примере в вакууме работает, но всё оказалось хуже. Не может подобрать подходящий конструктор для operator[]
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,732
29.08.2013, 22:25     Приватный конструктор и стандартный контейнер. Два барана на мосту #8
Цитата Сообщение от icpu Посмотреть сообщение
Не может подобрать подходящий конструктор для operator[]
покажи как конструктор копирования реализовал?
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
29.08.2013, 22:26     Приватный конструктор и стандартный контейнер. Два барана на мосту #9
Цитата Сообщение от icpu Посмотреть сообщение
Не может подобрать подходящий конструктор для operator[]
Ну так не используй его )
icpu
321 / 226 / 43
Регистрация: 10.03.2011
Сообщений: 1,091
Записей в блоге: 2
29.08.2013, 22:28  [ТС]     Приватный конструктор и стандартный контейнер. Два барана на мосту #10
Цитата Сообщение от ValeryS Посмотреть сообщение
может даже здесь
Ну, если он не может понять, какой из одного доступного конструктора выбрать...
Цитата Сообщение от ValeryS Посмотреть сообщение
она тебе точно нужна?
С ней будет раз в 300 спокойнее, но раз уж такая пляска пошла, то могу и отказаться. Люди, вон, от рук отказываются, чтобы выжить. Уж const 1 переживу.

Но, вообще, это ОЧЕНЬ ТУПО, уже созданный объект запихивать в контейнер не с помощью копирующего конструктора, а с помощью отвёртки. =\
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,732
29.08.2013, 22:32     Приватный конструктор и стандартный контейнер. Два барана на мосту #11
Цитата Сообщение от icpu Посмотреть сообщение
С ней будет раз в 300 спокойнее,
как ты собираешься присвоить ей значение?
если тебе не нужно чтобы кто то менял
то сделай её приват, что ты и сделал
и не одна стерлядь снаружи не достучится
а в своем классе уж разберись чтобы не испохабить
например присваивать только в конструкторе
icpu
321 / 226 / 43
Регистрация: 10.03.2011
Сообщений: 1,091
Записей в блоге: 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
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,732
29.08.2013, 22:47     Приватный конструктор и стандартный контейнер. Два барана на мосту #13
Цитата Сообщение от icpu Посмотреть сообщение
Мне просто не понятно, почему не происходит вызов нужного конструктора.
сдается мне именно из за константы
конструктор копирования пытается присвоить ей значение а это низя
Цитата Сообщение от icpu Посмотреть сообщение
AAA::AAA: невозможно обратиться к private член, объявленному в классе "AAA"
хотя могу ошибаться, нужно стандарт смотреть а у меня его под рукой нет
попробуй удалить const
если все в порядке будет то дело в ней, если нет то будем дальше смотреть
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
29.08.2013, 22:48     Приватный конструктор и стандартный контейнер. Два барана на мосту #14
Цитата Сообщение от ValeryS Посмотреть сообщение
конструктор копирования пытается присвоить ей значение а это низя
Почему присвоить? Там будет инициализация. operator = - да, нельзя.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2013, 22:55     Приватный конструктор и стандартный контейнер. Два барана на мосту
Еще ссылки по теме:
C++ Вызовется ли приватный деструктор?
shared_ptr и приватный деструктор C++
C++ Как изменить статический приватный член класса?
Как добавить в вектор приватный объект класса C++
Перевести на стандартный С++ C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,732
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 Посмотреть сообщение
нужно стандарт смотреть а у меня его под рукой нет
Yandex
Объявления
29.08.2013, 22:55     Приватный конструктор и стандартный контейнер. Два барана на мосту
Ответ Создать тему
Опции темы

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