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

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

Войти
Регистрация
Восстановить пароль
 
 
icpu
346 / 260 / 53
Регистрация: 10.03.2011
Сообщений: 1,215
Записей в блоге: 2
#1

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

29.08.2013, 21:49. Просмотров 740. Ответов 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
Что для меня весьма странно, ведь явно я его ни разу не вызывал. Чего не так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2013, 21:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Приватный конструктор и стандартный контейнер. Два барана на мосту (C++):

Приватный конструктор и деструктор - C++
Зачем нужны приватный конструктор и деструктор? Как они работают?

Стандартный векторный контейнер - C++
&quot;Обычно элементы создаются с помощью оператора new() и освобождаются с помощью оператора delete(), т.е. для создания нового элемента...

Класс как стандартный контейнер - C++
Здорова господа! Опять есть условие задачи: Напишите такие классы, чтобы Vector из 16.2.1 и Vector из 16.2.2 могли использоваться как...

Стандартный конструктор у union? - C++
Не могу сообразить в чем проблема struct Foo { union { struct {float x,y,z;} v; struct { ...

Struct (есть ли стандартный конструктор) - C++
Имеется студия 2010 struct _1C { string Tag; string Rus; string Eng; }; В коде пишу: vector&lt;_1C&gt;

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

19
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
29.08.2013, 21:53 #2
Цитата Сообщение от icpu Посмотреть сообщение
Что для меня весьма странно, ведь явно я его ни разу не вызывал
Значит operator [] у map вызывает. Попробуй insert или emplace.
0
BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
29.08.2013, 21:56 #3
Цитата Сообщение от icpu Посмотреть сообщение
Что для меня весьма странно, ведь явно я его ни разу не вызывал. Чего не так?
А неявный вызов при конструировании объекта класса внутри контейнера не в счет? Нет тут ничего странного.
0
icpu
346 / 260 / 53
Регистрация: 10.03.2011
Сообщений: 1,215
Записей в блоге: 2
29.08.2013, 22:00  [ТС] #4
Цитата Сообщение от gray_fox Посмотреть сообщение
Значит operator [] у map вызывает. Попробуй insert или emplace.
Ноуп. Не работает.
Цитата Сообщение от BRcr Посмотреть сообщение
А неявный вызов при конструировании объекта класса внутри контейнера не в счет? Нет тут ничего странного.
И щито делать, если не помогает явное создание конструктора копирования?
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
29.08.2013, 22:06 #5
Цитата Сообщение от icpu Посмотреть сообщение
Ноуп. Не работает.
Держи: http://ideone.com/2YrSWM
0
ValeryS
Модератор
6676 / 5085 / 475
Регистрация: 14.02.2011
Сообщений: 17,061
29.08.2013, 22:21 #6
Цитата Сообщение от icpu Посмотреть сообщение
Что для меня весьма странно, ведь явно я его ни разу не вызывал. Чего не так?
ты не вызывал конструктор вызывает
пытается выделить память под объект AAA
может даже здесь
Цитата Сообщение от icpu Посмотреть сообщение
AAA wut(c);
а у тебя стоит неинициализированая приватная константа
Цитата Сообщение от icpu Посмотреть сообщение
private:
const int ci;
что ты с ней собираешься делать
присвоить значение нельзя, константа все таки

она тебе точно нужна?
0
icpu
346 / 260 / 53
Регистрация: 10.03.2011
Сообщений: 1,215
Записей в блоге: 2
29.08.2013, 22:23  [ТС] #7
На сферическом примере в вакууме работает, но всё оказалось хуже. Не может подобрать подходящий конструктор для operator[]
0
ValeryS
Модератор
6676 / 5085 / 475
Регистрация: 14.02.2011
Сообщений: 17,061
29.08.2013, 22:25 #8
Цитата Сообщение от icpu Посмотреть сообщение
Не может подобрать подходящий конструктор для operator[]
покажи как конструктор копирования реализовал?
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
29.08.2013, 22:26 #9
Цитата Сообщение от icpu Посмотреть сообщение
Не может подобрать подходящий конструктор для operator[]
Ну так не используй его )
0
icpu
346 / 260 / 53
Регистрация: 10.03.2011
Сообщений: 1,215
Записей в блоге: 2
29.08.2013, 22:28  [ТС] #10
Цитата Сообщение от ValeryS Посмотреть сообщение
может даже здесь
Ну, если он не может понять, какой из одного доступного конструктора выбрать...
Цитата Сообщение от ValeryS Посмотреть сообщение
она тебе точно нужна?
С ней будет раз в 300 спокойнее, но раз уж такая пляска пошла, то могу и отказаться. Люди, вон, от рук отказываются, чтобы выжить. Уж const 1 переживу.

Но, вообще, это ОЧЕНЬ ТУПО, уже созданный объект запихивать в контейнер не с помощью копирующего конструктора, а с помощью отвёртки. =\
0
ValeryS
Модератор
6676 / 5085 / 475
Регистрация: 14.02.2011
Сообщений: 17,061
29.08.2013, 22:32 #11
Цитата Сообщение от icpu Посмотреть сообщение
С ней будет раз в 300 спокойнее,
как ты собираешься присвоить ей значение?
если тебе не нужно чтобы кто то менял
то сделай её приват, что ты и сделал
и не одна стерлядь снаружи не достучится
а в своем классе уж разберись чтобы не испохабить
например присваивать только в конструкторе
0
icpu
346 / 260 / 53
Регистрация: 10.03.2011
Сообщений: 1,215
Записей в блоге: 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, Так то оно так. Но, если есть такая возможность, почему её нельзя просто брать и использовать? Мне просто не понятно, почему не происходит вызов нужного конструктора.
0
ValeryS
Модератор
6676 / 5085 / 475
Регистрация: 14.02.2011
Сообщений: 17,061
29.08.2013, 22:47 #13
Цитата Сообщение от icpu Посмотреть сообщение
Мне просто не понятно, почему не происходит вызов нужного конструктора.
сдается мне именно из за константы
конструктор копирования пытается присвоить ей значение а это низя
Цитата Сообщение от icpu Посмотреть сообщение
AAA::AAA: невозможно обратиться к private член, объявленному в классе "AAA"
хотя могу ошибаться, нужно стандарт смотреть а у меня его под рукой нет
попробуй удалить const
если все в порядке будет то дело в ней, если нет то будем дальше смотреть
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
29.08.2013, 22:48 #14
Цитата Сообщение от ValeryS Посмотреть сообщение
конструктор копирования пытается присвоить ей значение а это низя
Почему присвоить? Там будет инициализация. operator = - да, нельзя.
0
ValeryS
Модератор
6676 / 5085 / 475
Регистрация: 14.02.2011
Сообщений: 17,061
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 Посмотреть сообщение
нужно стандарт смотреть а у меня его под рукой нет
0
29.08.2013, 22:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2013, 22:55
Привет! Вот еще темы с ответами:

Запустить приватный конструктор signleton PDO - PHP ООП
И снова singleton , не пойму как запустить приватный конструктор , мне нужно получить от него экземпляр соединения. А ООп у меня на...

Объявить класс, содержащий массив, индексатор для работы с этим массивом и приватный конструктор - C#
Объявить класс, содержащий одномерный целочисленный массив, индексатор для работы с этим массивом, а также приватный конструктор,...

Стандартный конструктор - C++ Builder
Не так давно знаком с С++ вообще и с ВС++В в частности, так что извините за глупость вопроса ) Задача: нужно, чтобы по нажатию TButton...

Стандартный контрол (контейнер) который мог бы в себе содержать элементы управления. - Visual Basic
Подскажите, есть какой либо стандартный контрол (контейнер) который мог бы в себе содержать элементы управления, а при большом их...


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

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

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