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

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

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

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

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

-1

Решение

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

#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';
}

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

-1

Другие решения

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

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

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

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.

3

По вопросам рекламы [email protected]