Я не уверен, что у меня есть вся терминология, чтобы описать вопрос, но вот как я опишу то, что мне интересно:
Предположим, у меня есть класс 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
}
}
Есть ли согласие о том, какой подход использовать? Если да, то по каким причинам предпочитаете один подход другому?
Переработка к наследуемому, как прокомментировал MrLister, в противном случае метод 1 имеет проблемы с владением объектом Если это невозможно, используйте метод 2, но измените как method(A &a)
(или же method(const A &a)
если это намерение), чтобы уточнить объект не требуется.
Из того, что вы описали, наследование выглядит как лучший путь. Класс 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; }
};