Как подходить к реализации методов класса, когда эти методы зависят от другого класса?

Я не уверен, что у меня есть вся терминология, чтобы описать вопрос, но вот как я опишу то, что мне интересно:

Предположим, у меня есть класс A и второй класс B, который использует данные из A в своих методах.

class A
{
data1
data2
etc...
}

class B
{
some_data
method1
{
// do stuff with some_data and A.data1, A.data2
}
method2
{
// do other stuff with some_data and A.data1, A.data2
}
}

Что меня интересует, так это то, считается ли лучше, что лучше сделать что-то вроде:
1.

class B
{
B(A *a)
{
this->a_ptr = a;
}
A *a_ptr

some_data
method1()
{
// do stuff with a_ptr->data1, a_ptr->data2
}
method2()
{
// do other stuff  with a_ptr->data1, a_ptr->data2
}
}

против

2.

class B
{
some_data
method1(A *a)
{
// do stuff with a->data1, a->data2
}
method2(A *a)
{
// do other stuff  with a->data1, a->data2
}
}

Есть ли согласие о том, какой подход использовать? Если да, то по каким причинам предпочитаете один подход другому?

0

Решение

Переработка к наследуемому, как прокомментировал MrLister, в противном случае метод 1 имеет проблемы с владением объектом Если это невозможно, используйте метод 2, но измените как method(A &a) (или же method(const A &a) если это намерение), чтобы уточнить объект не требуется.

0

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

Из того, что вы описали, наследование выглядит как лучший путь. Класс B сможет манипулировать вещами из класса A и класса B, как показано в коде ниже.

Из вашего комментария вы поднимаете вопрос о том, что это отношения «is-a». Если вы не думаете, что между A и B существует отношение «есть», то классы не зависят друг от друга. Вы не должны напрямую манипулировать данными из другого класса. Лучшим решением было бы вызвать функции-члены из класса A, чтобы получить желаемые результаты, которые вы хотите получить в классе B.

class A {
private:
int x,y;
public:
void set_values (int a, int b)
{ x=a; y=b;}
};

class B: public A {
private:
int z;
public:
int GetX ()
{ return x; }
int GetY ()
{ return y; }
int GetZ ()
{ return z; }

};

0

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