вызов функции между классами - PullRequest
0 голосов
/ 21 февраля 2011

привет У меня есть 3 класса класса A, B и C

класс A является основным классом и содержит также основную функцию, я называю класс B и класс C в основном как b1, b2 и c1.

в классе B есть вектор (V), имеющий список int. и 3 функции Добавить, получить и удалить удалить. все в классе общедоступно.

в классе C у меня есть функция, которая должна (B :: get) от b.

то, что я хочу, это то, что я могу заставить c1 вызывать get из b1, чтобы вернуть значение V в b1, после этого использовать add из b2, чтобы добавить новый элемент в V из b2. Заранее спасибо

Это пример

class a{
    int main(){
        b b1,b2;
        c c1;
        b1.add(10);
        b1.add(20);
        c1.start();
    }}

class b{
    vector<int> v;
    void add(int i){
        v.push_back(i)}
    int get(){int i=v.at(0); return i;}
    }

class c{// take something from b1 and add it to b2
    void play(){
        int i=b.get();//should take it from b1
        b.add(i*2);//should add it to b2
    }}

пожалуйста, мне нужна ваша помощь, я искал, чтобы решить эту проблему в течение нескольких дней.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2011

Класс c должен хранить ссылку на b1 и b2.

class c{
public:
    c(b& b1, b& b2): m_b1(b1), m_b2(b2) {}
    void play(){
        int i=m_b1.get();
        m_b2.add(i*2);
    }
private:
    b& m_b1;
    b& m_b2;
};

class a{
    int main() {
          b b1,b2;
          c c1(b1, b2);
          b1.add(10);
          b1.add(20);
          b1.play();
    }

По сути, когда объекту нужно использовать функциональность другого объекта (независимо от того, является ли он экземпляром того же класса или другого), вам нужен этот класс, чтобы получить дескриптор объекта, то есть указатель или ссылку .

0 голосов
/ 21 февраля 2011

Поскольку play хочет делать вещи, которые зависят от b1 и b2, они являются параметрами из play.
Как это:

class c
{
public:
    void play(const b& oneB, b& otherB)
    {
        int i = oneB.get();
        otherB.add(i * 2);
    }
}

int main()
{
    b b1, b2;
    c c1;
    b1.add(10);
    b1.add(20);
    c1.play(b1, b2);
}

Мы передаем ссылки (&), поскольку ваш лексер и токенизатор, скорее всего, имеют внутреннее состояние, и вы не хотите копировать их, но используете те же объекты.

Обратите внимание, что это C ++, а не Java, поэтому функция main является глобальной, а не функцией-членом какого-то класса.

Другая возможность - позволить другим объектам быть частью состояния c:

class c
{
public:
    c(const b& oneB, b& otherB) : m_b1(oneB), m_b2(otherB) {}
    void play()
    {
        int i = m_b1.get();
        m_b2.add(i * 2);
    }
private:
    const b& m_b1;
    b& m_b2;
}

int main()
{
    b b1, b2;
    c c1(b1, b2);
    b1.add(10);
    b1.add(20);
    c1.play();
}

Поскольку у вас есть проблемы с очень простыми понятиями, я предлагаю вам выбрать хорошую книгу по C ++ - вы можете найти списки здесь, в SO, если будете искать их.

0 голосов
/ 21 февраля 2011

Я думаю, что ответ на ваш вопрос - дать классу C ссылку / указатель на два разных объекта класса b.

Тогда вы можете просто написать

class c{// take something from b1 and add it to b2
    void play(){
        int i=b1.get();//should take it from b1
        b2.add(i*2);//should add it to b2
    }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...