我正在学习C ++。 我的问题与如何将类相同但类数不同的数据类附加到类有关。如果我可以通过模板调用这些成员,我可以减少编码。解释它们。请参阅下面的代码。
以下两个代码显示了一个人的书和游戏类型。
第一个是通过继承ItemHolder实现的。 Person_Inheritance类可以通过模板调用Book.print()或Game.print()。所以它只需要一个模板函数来调用它们。当我需要在ItemHolder下调用一些函数时,这种代码减少可以有更好的效果。
然而,人与书/游戏有关系。我了解到,当他们有关系时,我应该使用构图。所以我需要通过合成重写代码。
第二个代码与第一个代码做同样的事情,但它是由组合实现的。关键是类需要两个独立的函数来调用Book.print()或Game.print()。当我需要在ItemHolder类下调用一些函数时,我需要多次写几乎所有函数。它会导致更多的编码。
在我的问题摘要中,
(1)我可以通过模板函数调用类的数据成员吗?
(2)是否有必要遵守规则;也就是说,是一种相关的需要继承,还有一种关系需要的组合?
这可能是一个很长的问题。感谢您阅读它们。如果你告诉我你的解决方案或建议,我再次感谢你。
基础课程:
class Book {
public:
Book() = default;
virtual ~Book() = default;
void print(void) { std::cout << "Bible" << std::endl; };
};
class Game {
public:
Game() = default;
virtual ~Game() = default;
void print(void) { std::cout << "Pokemon" << std::endl; };
};
template <typename Item>
class ItemHolder {
public :
ItemHolder() = default;
virtual ~ItemHolder() = default;
void tellItem(void) {
item_.print();
}
private :
Item item_;
};
继承实施:
class Person_Inheritance : public ItemHolder<Book>,
public ItemHolder<Game> {
public:
Person_Inheritance() = default;
virtual ~Person_Inheritance() = default;
template <typename T_Item>
void showItem() {
ItemHolder<T_Item>::tellItem();
}
};
void test_0(void) {
Person_Inheritance John;
John.showItem<Book>();
John.showItem<Game>();
}
通过撰写实施
class Person_Composition {
public:
Person_Composition() = default;
virtual ~Person_Composition() = default;
void showBook() { book_.tellItem(); }
void showGame() { game_.tellItem(); }
private :
ItemHolder<Book> book_;
ItemHolder<Game> game_;
};
void test_1(void) {
Person_Composition Bill;
Bill.showBook();
Bill.showGame();
}
答案 0 :(得分:3)
在你的第二个例子(作文)中,你提到book_
和game_
是不可避免的。鉴于该课程,没有解决方法。
至少有两种解决方法。 C ++具有private
继承,这并不意味着IS-A关系。它将允许您重用第一个示例。
其次,您可以使用合成并拥有一个std::tuple<ItemHolder<Book>, ItemHolder<Game>>
成员。