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

标签 c++ templates

我正在学习 C++。 我的问题与如何将相同类但不同数据的数据类附加到一个类有关。如果我可以通过模板调用这些成员,我可以减少编码。解释他们。请看下面的代码。

下面两段代码表示一个人有什么样的书和游戏。

第一个是继承ItemHolder实现的。而 Person_Inheritance 类可以通过模板调用 Book.print() 或 Game.print()。所以它只需要一个模板函数来调用它们。当我需要调用 ItemHolder 下的一些函数时,这种代码减少可以有更好的效果。

但是,Person 和 Book/Game 是 has-a 关系。我了解到当他们有关系时我应该使用组合。所以我需要按组合重写代码。

第二个代码与第一个代码做同样的事情,但它是通过组合实现的。重点是该类需要两个单独的函数来调用 Book.print() 或 Game.print()。当我需要调用 ItemHolder 类下的一些函数时,我需要多次编写几乎所有的函数。它会导致更多的编码。

在我的问题总结中,

(1) 能否通过模板函数调用类的数据成员?

(2)是否有必要遵守规则;也就是说,is-a relatoin-ship 需要继承而 has-a relationship 需要组合?

这可能是一个很长的问题。感谢您阅读它们。如果您告诉我您的解决方案或建议,我再次感谢您。

基类:

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

最佳答案

在您的第二个示例(组合)中,您不可避免地会提到 book_game_ .鉴于该类,没有解决方法。

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

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

关于c++ - 我可以在 C++ 中通过模板调用类的成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41630093/

相关文章:

C++动态模板创建

c++ - 使用模板化可变模板参数作为专用参数

c++ - git_clone() 只克隆 .git 文件夹 (libgit2)

c++ - 错误 C2783 : '_Ty &&std::forward(remove_reference<_Ty>::type &&) throw()' : could not deduce template argument for '_Ty'

C++ 概念看到我的类型的函数,但看不到 std::vector 的函数

c++ - 如何在C++中使用 "type ... pack-name"参数包?

c++ - 我可以使用 malloc 为类对象分配内存吗?

c++ - 测试字节顺序兼容性的工作流程

java - 如何检查 FreeMarker 模板中是否存在变量?

c++ - 为什么我应该在函数签名中避免 std::enable_if