Передача многокарточных данных, созданных в одном классе, в другой класс - PullRequest
0 голосов
/ 01 апреля 2019

Извинения, если это тривиальная проблема.

Я пытаюсь передать мультикарту, которая была объединена с одним классом в библиотеке, в другой класс в этой библиотеке для дальнейшей обработки данных там.

Код относится к графическому интерфейсу, написанному другими людьми, и приведенные здесь классы относятся к двум разным инструментам в графическом интерфейсе.

Очень грубо говоря, мой код и то, что я здесь, похожэто

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***
            }
        }

Однако я не могу заставить что-либо сделать что-то подобное

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Мне не нужно будет работать с картой, только получать от нее информацию.

Затем можно добавить функцию для возврата константной ссылки на карту и функции длявозврат константных итераторов в 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_t& 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 A& a) {
    for(A::const_iterator it = a.begin(); it!=a.end(); ++it) {
        std::cout << it->first << " " << it->second << "\n";
    }
}

или получить прямой доступ к карте:

void bFunction(const A& a) {
    const A::intdoublemap_t& mref = a.getMap();
    //...
}
0 голосов
/ 01 апреля 2019

Члены C ++ private не могут быть доступны другим (не друзьям) классам. Первым решением было бы оставить mMap закрытым (не вежливым для работы с другими учениками) и предлагать экспертов по нему.

      class A
        {
        public:
            typedef std::multimap<int, double> MultiMapDataType;
        private:
            MultiMapDataType mMap;
            ***some more definitions***
        public:
            const MultiMapDataType& 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::MultiMapDataType& 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());

Тем не менее, с архитектурной точки зрения, если у вас есть несколько элементов, которыми вы хотите поделиться, вы должны переместить их всех в новую структуру / класс, который инкапсулирует эти функции.

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