C++ Design: Как мне установить два класса, которые совместно используют набор переменных?

Это может быть глупым вопросом, но как лучше всего программировать 2 класса, которые используют набор переменных?

  1. Класс A и класс B оба должны иметь доступ к int x и int y.
  2. Если класс A меняет x или y, изменения должны быть отражены в классе B

Мои мысли: класс A и B могут наследовать класс C (который содержит переменные x,y) - но это создаст экземпляр c для обоих A,B. - Мне нужен только один экземпляр х и у

Может мне нужен класс друга или статические переменные?

2 ответа

Решение

Используйте базовый класс со статическими переменными:

#include <iostream>
struct C
{
    static int x;
    static int y;
};

struct A : C
{

};

struct B : C
{

};

int C::x = 0;
int C::y = 0;

int main()
{
    A a;
    a.x = 1;
    a.y = 2;
    B b;
    std::cout << b.x << b.y << '\n';
}

Если вы оказались в ситуации, когда считаете, что вам нужно это сделать, пожалуйста, пересмотрите свой дизайн.

Прежде всего - это зависит. Вы не рассказали нам всю историю. Но вы уже сделали некоторые предположения, которые я хочу отговорить вас сделать.

Тот факт, что А и В совместно используют некоторые общие данные, не означает, что они по сути одинаковы. У человека может быть пункт назначения поездки, и у конференции может быть место встречи, но это не означает, что они должны быть подклассами одного и того же.

Поэтому вполне может быть, что вам следует использовать следующее:

struct C { int x; int y; };

class A { 
    C& foo;
    int bar;
    A(C& some_c) : foo(some_c) { }
    // ... etc. ...
};

class B { 
    C& baz;
    int qux;
    A(C& some_c) : baz(some_c) { }
    // ... etc. ...
};

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

Примечание: пример, который я привел, не рассматривает потенциальную дивергенцию в области видимости / времени жизни переменных A, B и C. Если есть такое расхождение, возможно, имеет смысл создать все эти объекты в куче и удерживать A и B std::shared_ptrк C.

Другие вопросы по тегам