2013-07-31 4 views
0

Я не уверен, что у меня есть вся терминология, чтобы иметь возможность описать вопрос, но вот как я опишу, что мне интересно:Как подходить к внедрению методов класса, когда эти методы зависят от другого класса?

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

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

Ehm, метод 1 должен быть записан как унаследованный класс. 'class b: public A' Если я что-то не хватает. –

+0

Спасибо, но, может быть, я немного смущен. Я всегда думал, что унаследованные классы должны использоваться, когда у вас есть отношение «is-a». Поэтому в этом случае я думаю, что это не уместно. Было бы немного похоже на то, что класс «водитель» наследуется от класса «автомобиль», что кажется мне странным, но классный водитель все еще должен знать, например, если автомобиль является автоматической/механической коробкой передач, оставшимся бензином и т. Д. – user1790399

ответ

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

};