【发布时间】:2022-01-19 12:13:26
【问题描述】:
不幸的是,我遇到了重复源代码的问题。 这是一个小例子来说明我的问题:
class cPlayer
{
public:
struct Properties
{
std::vector<cStreet*> Streets;
std::vector<cHouse*> Houses;
std::vector<cComputer*> Computers;
std::vector<cBook*> Book;
};
cPlayer(std::string name) : m_name{name}{};
~cPlayer(){};
std::string m_name{};
Properties m_Properties;
// function overloaded
void buy(cStreet& Street);
void buy(cHouse& House);
void buy(cComputer& Computer);
void buy(cBook& Book);
};
void cPlayer::buy(cStreet& Street)
{
std::cout << m_name.c_str() << " : Do you want buy this Street?" << std::endl;
//Todo: Decision (here yes)
m_Properties.Streets.push_back(&Street);
};
void cPlayer::buy(cHouse& House)
{
std::cout << m_name.c_str() << " : Do you want buy this House?" << std::endl;
//Todo: Decision (here yes)
m_Properties.Houses.push_back(&House);
};
void cPlayer::buy(cComputer& PC)
{
std::cout << m_name.c_str() << " : Do you want buy this PC?" << std::endl;
//Todo: Decision (here yes)
m_Properties.Computers.push_back(&PC);
};
void cPlayer::buy(cBook& Book)
{
std::cout << m_name.c_str() << " : Do you want buy this Book?" << std::endl;
//Todo: Decision (here yes)
m_Properties.Book.push_back(&Book);
};
所以 4 个成员函数 buy() 实际上都有相同的逻辑。但是,会输出单个文本,并且始终使用单个 std::vector。当然,只实现一次功能会更加优雅。但是怎么做? 我只想到模板,但是如何切换正确的vector()来保存属性?
一个问题接一个问题。如果我能深思熟虑就好了,因为这样的“问题”经常出现在我的源代码中。
谢谢!
【问题讨论】:
-
您可以使该方法成为具有两个参数的模板,(1) 它使用的类型和 (2) 指向 Properties 相应成员的成员指针。
-
使用访客设计模式
标签: c++