我仍然是C ++新手,一直在努力找到解决这个问题的方法。 我有一个格式为多行的文件:
[char] [double] [double]
例如:
p 100 0.80
r 50 50
p 20 4.8
r -100 25
我想使用行号的名称将这些行存储在Complex类的对象中:
class Complex {
private:
int name;
char type;
double a;
double b;
public:
Complex(int name, char type, int x, int y);
char gettype();
double geta();
double getb();
};
我还想使用自定义构造函数创建它们:
Complex::Complex(int name, char type, int x, int y){ //All data stored in standard form
if (type = 'p'){
a = x*cos(y);
b = x*sin(y);
}
else if (type = 'r'){
a = x;
b = y;
}
else{
std::cout << "Error" << std::endl;
a = 0;
b = 0;
}
}
我可以将字符串拆分为双打和字符,但我很难存储信息。起初我以为我能够使用循环动态命名它们,但我听说无法在C ++中动态创建类的实例。然后我看了创建一个数组,但其他解决方案已声明必须使用默认构造函数完成此操作?当我不知道将有多少行并使用我自己的构造函数时,有没有办法存储这些信息? 另外,构造函数中生成的a和b的值是否会存储在对象中?
答案 0 :(得分:2)
处理这个问题的最简单方法是将数据存储在std :: vector中,使用带字符串的构造函数将输入行拆分为适当的值,如下所示:
Complex::Complex(int line_no, std::string const& input)
{
... Construct complex object using functionality you already know/have ...
}
...
// Process the file
std::ifstream input("inputfile.data");
int line_no = 1;
while (input.is_open() && input.good() && !input.eof())
{
std::string line;
std::getline(input, line);
complex_vector.push_back(Complex(line_no, line));
++line_no;
}
答案 1 :(得分:1)
就你的构造函数而言,你已经覆盖了a
和b
。还有两个你尚未处理的成员:
Complex::Complex(int name, char type, int x, int y): name(name), type(type){
// a and b handled here
}
另请注意,'p'
和'r'
的测试应该更像这样:
if (type == 'p'){ // double equals tests for equality