Как получить доступ к переменным в другом классе из другого класса? - PullRequest
2 голосов
/ 22 декабря 2010

Давайте просто скажем, что у нас есть два класса, A и B.
Вот код для них обоих

class A
{
public:
    int x;
};

class B
{
public:
    int y;
    void FindY() { y = x + 12; }
};

void something()
{
    A fs;
    B fd;
    fs.x = 10;
    fd.FindY();
}

проблема в том, что я хочу получить доступ к х, но яне хочу ничего передавать в качестве аргумента моей функции, я смотрю на друга и наследование, но оба, кажется, не помогли мне, поправьте меня, если я ошибаюсь.
как мне найти х в функции FindY().
Я собираюсь использовать статический метод, но в моем случае я получаю эту ошибку.

Ошибка 2, ошибка LNK2001: неразрешенный внешний символ "public: static class std::vector<class GUIDialog *,class std::allocator<class GUIDialog *> > Window::SubMenu" (?SubMenu@Window@@2V?$vector@PAVGUIDialog@@V?$allocator@PAVGUIDialog@@@std@@@std@@A) C:\Users\Owner\documents\visual studio 2010\Projects\Monopoly\Monopoly\Window.obj Вот как я это объявил

static vector<GUIDialog *> SubMenu;

Я получаю эту ошибку из-за этой строки

SubMenu.resize(3);

Ответы [ 3 ]

8 голосов
/ 22 декабря 2010

Три разных подхода:

  1. Заставить B :: FindY принять объект A в качестве параметра

    class B {
    public:
      void FindY(const A &a) { y = a.x + 12; }
    };
    
  2. Сделать A ::x static

    class A {
    public:
      static int x;
    };
    class B {
    public:
      void FindY() { y = A::x + 12; }
    };
    
  3. Заставить B наследовать от A.

    class B : public A {
    public:
      void FindY() { y = x + 12; }
    };
    

CashCow также указывает на другие способы сделать это в своем ответе.

1 голос
/ 22 декабря 2010

Предполагая, что A является правильным, и вы не можете изменить его, то есть x является переменной-членом, вам потребуется экземпляр A для использования его члена x.

Таким образом, мы можем изменить B, но вам нужно FindY (), чтобы не принимать никаких параметров.

Поэтому нам нужно ввести A с более ранним вызовом и сохранить его как члена класса.

class B
{
public:
   A a;
   int y;
   void FindY() { y = a.x + 12; }
};

Это всего лишь набросок. Это то, что обычно делается для классов «функторов», где функция является оператором () и принимает фиксированное число ожидаемых параметров, но мы хотим большего. Весь boost :: bind основан на этом принципе.

1 голос
/ 22 декабря 2010

Как таковое, x - это не переменная класса A, а переменная объектов ("экземпляров") класса A.Есть по крайней мере два способа сделать x доступным из B::findY, не передавая ничего функции:

  • Создание объекта класса A внутри функции B::findY:
    class B
    {
    public:
        int y;
        void FindY() { A a; y = a.x + 12; }
    };
  • Сделать x статической переменной, чтобы она была переменной самого класса.Вам не нужно создавать экземпляры объектов в этом случае, но переменная будет общей для всех объектов типа A (поэтому вы не можете иметь разные значения x для разных объектов):
    class A
    {
    public:
        static int x;
    };

    class B
    {
    public:
        int y;
        void FindY() { y = A::x + 12; }
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...