我正在尝试从文件中加载看起来像
的A和B对象A 3 4
B 2 4 5
B 3 5 6
A 2 3
我有以下类,Base,A和B,Base的子类。每个都与运营商>>超载。
问题出在函数load()中。我不确定如何实例化对象..我的load()无法编译,因为‘pO’ was not declared in this scope
。
我该怎么办呢?或者最好的方法是什么?
另外,如果我设法让它以某种方式工作,我是否需要手动删除对象?
class Base
{
public:
Base() {}
Base(int tot_) : tot(tot_) {}
void print() const {
std::cout << "Tot : " << tot << std::endl;
}
private:
int tot;
};
class A : public Base
{
public:
A() : Base(0) {}
A(int a1, int a2) : Base(a1+a2) {}
};
class B : public Base
{
public:
B() : Base(1) {}
B(int b1, int b2, int b3) : Base(b1+b2+b3){}
};
std::istream& operator>>(std::istream& in, A& a)
{
int a1, a2;
in >> a1;
in >> a2;
a = A(a1,a2);
return in;
}
std::istream& operator>>(std::istream& in, B& b)
{
int b1, b2, b3;
in >> b1;
in >> b2;
in >> b3;
b = B(b1,b2,b3);
return in;
}
bool load(const std::string& s, std::vector<Base*>& objs)
{
std::ifstream is(s.c_str());
if (is.good())
{
std::string obj;
while (!is.eof())
{
is >> obj;
if (obj == "A") {
A *pO = new A;
}
else (obj == "B") {
B *pO = new B;
}
is >> *pO;
objs.push_back(pO);
}
is.close();
return true;
}
return false;
}
答案 0 :(得分:0)
您必须在使用它的范围内声明pO
:
is >> obj;
Base *pO;
if (obj == "A") {
A *a = new A;
is >> *a;
pO = a;
}
else { // (obj == "B")
B *b = new B;
is >> *b;
pO = b;
}
objs.push_back(pO);
答案 1 :(得分:0)
你的另一个问题的答案是“我需要手动删除对象”是肯定的,用new
分配的对象总是需要用delete
删除。
但是,由于您将指针推送到数组,因此请确保在它们仍在使用时过早删除它们!
因此,另一种解决方案是不使用指针。将obj
数组Base
而不是Base*
数组,并避免使用new
或delete
。
编辑:
没有指针,我会写这样的东西:
while (!is.eof()) {
is >> obj;
if (obj == "A") {
A pO;
is >> pO;
objs.push_back(pO);
}
else if (obj == "B") {
B pO;
is >> pO;
objs.push_back(pO);
}
}
但请确保不要通过将成员变量添加到A类或B类来导致任何对象切片!