#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