gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:57:25 25 4
gpt4 key购买 nike

我正在学习 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com