#c #visual-c
#c #visual-c
Вопрос:
Прошу прощения, если это тривиальная проблема.
Я пытаюсь передать multimap, который был объединен с одним классом в библиотеке, в другой класс в этой библиотеке, чтобы в дальнейшем манипулировать данными там.
Код относится к графическому интерфейсу, написанному другими людьми, а классы здесь относятся к двум разным инструментам в графическом интерфейсе.
Очень грубо говоря, мой код и то, что мне нужно здесь, выглядит так
class A
{
private:
std::multimap<int, double> mMap;
int anInt;
double aDouble;
***some more definitions***
public:
void aFunction(***openscenegraph node, a string, and a parser function***)
{
***a few definitions are declared and initialised here
during calculations***
***some code calculating data stuff that
passes bits of that data to mMap (including information
initialised within the function)***
}
}
class B
{
public:
void bFunction(***openscenegraph node and some other data***)
{
***I want to be able to access all the data in mMap here***
}
}
Может ли кто-нибудь объяснить мне, как я могу это сделать, пожалуйста?
Редактировать: добавлено, чтобы уточнить, к чему я стремлюсь
//Edit by Monkone
//section below is akin to what I'm trying to do
class B
{
private:
std::multimap<int, double> mMapb;
public:
std::multimap<int,double> bFunction2(A::MultiMapDataType data)
{
return mMap;
}
void bFunctionOriginal()
{
***I want to be able to access all the data in mMap here***
***i.e. mMapb.bFunction2(mMap);***
***do stuff with mMapb***
}
}
Однако я не могу заставить что-либо на самом деле сделать что-то подобное
Комментарии:
1. Вы можете получить эти данные из object
A
и передать их в качестве аргументаvoidbFunction()
функции.2. Что вы контролируете?
class B
только?3. Связаны ли
A
иB
? Каковы ограничения на классы?4. Я могу управлять обоими классами. В нынешнем виде классы находятся в одном проекте в многопроектном решении. Данные из других проектов передаются в каждый из классов A и B. Я застрял на том, чтобы передавать данные из класса A в класс B. Я просто не знаю, как это можно сделать. Похоже, на данный момент я не могу напрямую получить доступ к чему-либо, созданному в классе A, в классе B.
5. @Monkone Вы имеете в виду, что хотите изменить
private
поля наpublic
fields?
Ответ №1:
Мне не нужно будет работать с картой, только получать из нее информацию.
Затем вы могли бы добавить функцию для возврата постоянной ссылки на карту и функции для возврата итераторов const в A
:
class A {
public:
typedef std::multimap<int, double> intdoublemap_t;
typedef intdoublemap_t::const_iterator const_iterator;
// typedef intdoublemap_t::iterator iterator;
private:
intdoublemap_t mMap;
public:
// direct access to the whole map
const intdoublemap_tamp; getMap() const { return mMap; }
// iterators
const_iterator cbegin() const { return mMap.begin(); }
const_iterator cend() const { return mMap.end(); }
const_iterator begin() const { return cbegin(); }
const_iterator end() const { return cend(); }
/*
iterator begin() { return mMap.begin(); }
iterator end() { return mMap.end(); }
*/
};
Теперь вы можете выполнять итерации по карте извне (из B
):
void bFunction(const Aamp; a) {
for(A::const_iterator it = a.begin(); it!=a.end(); it) {
std::cout << it->first << " " << it->second << "n";
}
}
Или доступ к карте напрямую:
void bFunction(const Aamp; a) {
const A::intdoublemap_tamp; mref = a.getMap();
//...
}
Комментарии:
1. Спасибо, однако есть еще одна загвоздка 🙂 Я могу работать только на c 98 и могу работать только в VS 2008 без какой-либо формы intellisense или списков функций по мере ввода. Это действительно высветило то, чего я не знаю… Хотя я могу погуглить, как написать это для цикла в стиле 98. На самом деле проблема заключается в вызове функции внутри класса B, которая передает данные непосредственно туда, вот в чем проблема
2. Это действительно так. Этому не помогает тот факт, что здесь не используется функция int main(), а в aFunction и bFunction уже есть 4 другие вещи, которые считываются в них в графической части программных файлов. Я пытаюсь преобразовать что-то похожее на то, что вы написали, во вторую функцию B, которая вызывается функцией класса B (которая привязана к нажатию кнопки в графическом интерфейсе), но мне все еще не удается получить эту карту. Класс B не может быть вызван до тех пор, пока класс A уже не будет вызван, поскольку до этого нет ничего, что можно переключить, подключенного к классу B.
3. если я хочу вызывать только часть multimap из
A
inbFunction
, нужно ли мне вводить ее как bFunction (A::mMap amp; a)?A
поскольку класс содержит в себе многое4. Нет, подписи двух
bFunction
, которые я сделал выше, должны работать как есть.5. Спасибо, я боюсь, что в том, что я делаю, все еще что-то не так, но вы и cprogrammer оба дали мне несколько хороших советов. Я буду продолжать возиться, и, надеюсь, что-то сработает.
Ответ №2:
Члены C private
не могут быть доступны другим классам (не являющимся друзьями). Первым решением было бы сохранить mMap закрытым (невежливо работать с другими членами классов) и предлагать оценщикам использовать его.
class A
{
public:
typedef std::multimap<int, double> MultiMapDataType;
private:
MultiMapDataType mMap;
***some more definitions***
public:
const MultiMapDataTypeamp; getConstMMap() const;
MultiMapDataType getMMap();
}
class B
{
public:
void bFunction(A::MultiMapDataType data)
{
***I want to be able to access all the data in mMap here***
}
void bFunction2(const A::MultiMapDataTypeamp; data)
{
***I want to be able to access all the data in mMap here***
}
}
A a;
B b;
b.bFunction(a.getMMap());
b.bFunction2(a.getConstMMap());
Однако, с архитектурной точки зрения, если у вас есть несколько членов, которыми вам нужно поделиться, вы должны переместить их все в новую структуру / класс, который инкапсулирует эту функциональность.
Комментарии:
1.
getMMap()
должно бытьconst
тоже, я думаю?2. Вероятно, это предназначалось для возврата ссылки, в противном случае этот метод бессмыслен, поскольку вы могли бы назначить первую версию новой переменной для того же эффекта (при условии, что они просто возвращаются
mMap
).3. Я не уверен, что я понимаю здесь. Вы хотите сказать, что нужно создать функцию в классе A, которая возвращает mMap, и вызвать эту функцию в классе B на мультикарте, которую я создаю там, чтобы передать данные?
4. Извините, я действительно не понимаю, как это может решить проблему. Я еще не свободно владею c , не могли бы вы мне это объяснить?
5.
getConstMMap
возвращает постоянную ссылку.getMMap
возвращает копию карты. Работать непосредственно с элементами map не нормально, если вам нужно работать с элементами, тогда вам действительно нужно переместить данные (mMap
) за пределы класса,