Передача данных multimap, созданных в одном классе, в другой класс

#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 in bFunction , нужно ли мне вводить ее как 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 ) за пределы класса,