Передача карты между классами

#c #visual-studio #c 98

#c #visual-studio #c 98

Вопрос:

Это связано с более ранним вопросом, который у меня был. Мне не удалось решить проблему там, но сейчас я просто пытаюсь лучше ознакомиться с кодом, чтобы выяснить, как справиться с этой проблемой.

Для достижения этой цели у меня есть время опробовать предложения, приведенные в этом вопросе, и я немного озадачен тем, почему следующее не работает.

в заголовке у меня есть

 class A {
public:
    typedef std::multimap<int, double> intdoublemap_t;
    const intdoublemap_tamp; getMap() const; 
    void setkey(int k);
    void setvalue(double v);
    void insertIntoMap();
    intdoublemap_t mMapA;

private:
    int key;
    double value;

};

class B {
public:
    typedef std::multimap<int, double> intdoublemap_t;
    void mapValues(const Aamp; a);
private:
    intdoublemap_t mMapB;

};
  

в реализации у меня есть

 const A::intdoublemap_tamp; A::getMap() const { return mMapA; }
void A::setkey(int k) { key = k; }
void A::setvalue(double v) { value = v; }
void A::insertIntoMap(){mMapA.insert(std::make_pair(key, value));}

void B::mapValues(const A amp; a){ const A::intdoublemap_tamp; mref = a.getMap();
                                mMapB = mref; }
  

и в main()

 A a;
a.setkey(10);
a.setvalue(1232.2);
a.insertIntoMap();
B b;
b.mapValues(a);
  

Код компилируется нормально, и все, что связано с a, работает как ожидалось, но карта вообще не передается в b. Она остается пустой

Кто-нибудь может сказать мне, почему?

редактировать: я еще раз взглянул на это и увидел, как это сделать. Я знал, что это было что-то глупо базовое. Мне просто нужно было установить mref в функции на карту в B, а затем вызвать функцию для работы с этой картой в B.

Комментарии:

1. const A::intdoublemap_tamp; mref = a.getMap(); создает локальную ссылку на a.getMap() и затемняет элемент данных mref .

2. Я не уверен, каковы ваши намерения. Если это должно заставить this->mref стать ссылкой на a.getValue() , то этот подход не сработает. Вам понадобится схема указателей, вероятно std::share_ptr<intdoublemap_t> , чтобы выразить совместное владение.

3. Извините, я не понимаю

4. Ах, не видел вашего второго комментария, пока не обновил. Цель состоит в том, чтобы передать карту, созданную в классе A, в класс B. Я просто пытаюсь выяснить, как это сделать, чтобы затем я мог реализовать метод в другом проекте, где мне нужно сделать что-то вроде этого

5. Boost предоставляет надежную альтернативу. В противном случае довольно близкое приближение может быть написано на c 98, за вычетом семантики перемещения. Я добавил тег c 98 к вашему вопросу.

Ответ №1:

Как отмечает @FrancoisAndrieux, вы getMap() устанавливаете локальную ссылку только на функцию, а не на класс’ intdoublemap_t mref . Если вы хотите, чтобы последняя была ссылкой на карту в другом месте, у вас есть три варианта:

  • Создайте ее intdoublemap_tamp; mref , инициализируйте при построении экземпляра B.
  • Создайте ее std::reference_wrapper<intdoublemap_t> mref , установите ее, когда захотите (например, в mapValues() .
  • Создайте ее intdoublemap_t* (или std::shared_ptr<intdoublemap_t> как в A, так и в B), установите ее, когда захотите.

Примечание: Как говорит @FrancoisAndrieux в комментарии, со вторым и третьим вариантом (и без std::shared_ptr ) вам придется быть осторожным, чтобы не разрешить использование ссылки после истечения срока службы исходного объекта.

Сказав все вышесказанное, я должен также сказать, что ваш дизайн кажется мне довольно странным. Вам действительно не следует делать ничего из этого, и я на 99% уверен, что вы подходите к своей задаче неправильно.

Комментарии:

1. Для 2-го решения и 3-го решения, если вы не используете shared_ptr , вы обнаружите, что управление временем жизни для фактического intdoublemap_t будет затруднено и, вероятно, будет разрешено использовать std::shared_ptr в любом случае.

2. Какие еще существуют варианты передачи данных между классами? Я почти понятия не имею, как это сделать, и попытка поискать подходы в Google привела меня в замешательство относительно того, как реализовать что-либо в более крупном проекте, и поэтому я попытался использовать то, что казалось самым простым подходом: просто передать карту данных из одного класса в другой. Оказывается, это не так просто

3. Извините, я пробую ваши предложения и получаю только ошибки. Как ваши предложения должны вписываться в то, что я написал? Пожалуйста, не относитесь ко мне так, будто я знаю, что я здесь делаю. Объясните это так, как будто мне 5

4. @Monkone: Я не понимаю, какой смысл имеют ваши классы.

5. Вероятно, это потому, что а) это попытка научиться обходить другую проблему и б) я новичок в c . Я имею в виду, я вроде как понимаю предложения einpoklums, но прошлой ночью, перед тем как отправиться спать, я не видел, как вписать какие-либо из его предложений в мой код. Я подозреваю, что mref нужно изменить на cref, чтобы использовать его предложение reference_wrapper