我有一个问题,关于解决这个问题的最佳方法,我确定要传递给我的重载运算符的类<<()函数..
我的<<函数从输入文件中读取一行,对其进行标记并将该数据插入到Customer,Tour或GuidedTour对象中,具体取决于该特定行的第一个标记
Tour是GuidedTour的基类,但客户根本不相关,所以我不认为我可以在它们之间使用演员(或者我可以吗?)
这是代码:
for (unsigned int i = 0; i < inputFiles.size(); i++)
{
ifstream fin(inputFiles[i], ios_base::in);
int line = 0;
char c;
while (fin)
{ line++;
c = fin.peek(); //use peek() to check first char of next line
if (c == ios::traits_type::eof())
break;
// this is where i am having the trouble
else if (c == 'C')
Customer *temp = new Customer();
else if (c == 'g')
GuidedTour *temp = new GuidedTour();
else if (c == 't')
Tour *temp = new Tour();
else
throw boost::bad_lexical_cast();
try
{
fin >> *temp;
}
catch(boost::bad_lexical_cast&)
{
cerr << "Bad data found at line " << line
<< " in file "<< inputFile[i] << endl;
}
customers.push_back(temp);
}
fin.close();
}
很明显,我遇到了麻烦;因为我正在初始化条件块内的对象,它们不会在该块完成后继续存在,但我不知道如何让它们持久...或者它是不可能做我想要实现的目标?
我知道这不是一个非常直接的问题,我只是一直试图解决这个问题多年来一直在砖墙上,所以任何建议都会非常感激..
编辑:是否可以做一些事情,比如在名为temp的循环开始时使用void指针,然后在将它传递给fin&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; *温度?
答案 0 :(得分:0)
@ guskenny83 基本的前提是声明一个voir指针并将值推入其中,只需记住正确引用/ deference,否则你将获得一些可爱的十六进制值打印。举个简单的例子,我可以通过手动控制变量类型来考虑以下方法:
#include <iostream>
#include <stdio.h>
enum Type
{
INT,
FLOAT,
};
using namespace std;
void Print(void *pValue, Type eType)
{
using namespace std;
switch (eType)
{
case INT:
cout << *static_cast<int*>(pValue) << endl;
break;
case FLOAT:
cout << *static_cast<float*>(pValue) << endl;
break;
}
}
int main()
{
cout << "Hello World" << endl;
int me = 3;
void* temp;
if (me == 2)
{
int i = 12;
temp = &i;
}
else
{
float f = 3.2;
temp = &f;
}
if (me == 2)
{
Print(temp,INT);
}
else
{
Print(temp,FLOAT);
}
return 0;
}
我会尝试一种不同的方法,也许使用类层次结构的重构而不是void指针:它们允许你寻找的东西,但它们确实避免了类型检查......
希望这可以帮助你:)
让我知道一些反馈,我可以回复你。