我可以在C ++中通过模板调用类的成员吗?

时间:2017-01-13 08:16:56

标签: c++ templates

我正在学习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();
}

1 个答案:

答案 0 :(得分:3)

在你的第二个例子(作文)中,你提到book_game_是不可避免的。鉴于该课程,没有解决方法。

至少有两种解决方法。 C ++具有private继承,这并不意味着IS-A关系。它将允许您重用第一个示例。

其次,您可以使用合成并拥有一个std::tuple<ItemHolder<Book>, ItemHolder<Game>>成员。