C++ 删除变量分配的重复行
我目前正在做一个项目,在一个类中,我将从用户输入中获取大量变量。有没有办法阻止这样的事情:C++ 删除变量分配的重复行,c++,C++,我目前正在做一个项目,在一个类中,我将从用户输入中获取大量变量。有没有办法阻止这样的事情: class Person { std::string firstName, lastName, DoB, address; int personID, durationMins, totalVisits; void setValues(std::string
class Person
{
std::string firstName,
lastName,
DoB,
address;
int personID,
durationMins,
totalVisits;
void setValues(std::string values[])
{
firstName = values[0];
lastname = values[1];
DoB = values[2];
// ... etc
}
};
我希望避免有大量的行专门用于变量赋值,尽管我不知道这是否可行。任何帮助都将不胜感激,谢谢 由于您可能是通过某种
std::istream
从用户处获取输入,因此获取输入的一种优雅方式是重载插入运算符
class Person {
/* ... */
friend std::istream& operator>>(std::istream& stream, Person& p) {
stream >> p.firstName >> p.lastName >> p.DOB;
/* might not be very straightforward to input address as you need to take care of spaces */
/* put address processing logic here */
std::getline(stream, p.address);
return stream;
}
};
int main () {
Person person;
std::cin >> person;
return 0;
}
您还可以重载提取运算符。在C++11及以上版本中,您可以使用
std::reference\u wrapper
或助手函数std::ref
生成成员字符串的引用数组,然后此数组基于的范围适用于初始化,如下所示:
class Person {
/* ... */
friend std::istream& operator>>(std::istream& stream, Person& p) {
stream >> p.firstName >> p.lastName >> p.DOB;
/* might not be very straightforward to input address as you need to take care of spaces */
/* put address processing logic here */
std::getline(stream, p.address);
return stream;
}
};
int main () {
Person person;
std::cin >> person;
return 0;
}
添加 正如@HolyBlackCat在评论中所建议的,这看起来更简单:
这可以通过一个简单的可变模板函数来解决:
template <typename T, typename ...P> void AssignArrayElementsTo(const T *array, P &... objects)
{
std::size_t i = 0;
((objects = array[i++]) , ...);
}
// ...
void setValues(std::string values[])
{
AssignArrayElementsTo(values, firstName, lastName, DoB, address);
}
template void AssignArrayElementsTo(常量T*数组,P&…对象)
{
标准:尺寸i=0;
((objects=array[i++]),…);
}
// ...
void setValues(标准::字符串值[])
{
AssignArrayElementsTo(值、名字、姓氏、出生日期、地址);
}
<>遗憾的是C++没有反射(所以),所以你仍然需要手动列出所有需要的类成员。这是没有办法的。研究循环。@JesperJuhl据我所知,你不能做一个分配完全不同变量的循环吗?循环在这里没有帮助,这是我试图处理的问题。我不知道这样做。您可以避免多行作业。请参见以下内容:如何使用领带执行此操作:。请参见如何将数组转换为tie:。您仍然必须声明所有这些变量。您可以创建一个循环,将数据读入容器的后续元素(如
std::vector
)。您应该尝试重载流运算符。您希望stream>>…>>p、 地址
要工作吗<代码>地址可能包含空格。这是一个例子,不应该是替代品。用户需要添加更多代码以获取包含空格的输入(用于获取要传递给setValues
的地址的任何逻辑都可以放入>
重载中)。我们要说明的一点是,如果输入是从用户处获取的,那么可以通过重载>
操作符来获取所有输入。我对答案进行了编辑,以明确答案。或者,您可以使用指针:auto*str:{&firstName,&lastName,…}
。要输入的字符少了一点。
template <typename T, typename ...P> void AssignArrayElementsTo(const T *array, P &... objects)
{
std::size_t i = 0;
((objects = array[i++]) , ...);
}
// ...
void setValues(std::string values[])
{
AssignArrayElementsTo(values, firstName, lastName, DoB, address);
}