2013-10-07 5 views
0

Я пытаюсь загрузить объекты А и В из файла, который будет выглядеть какЗагрузка различных объектов из файла

A 3 4 
B 2 4 5 
B 3 5 6 
A 2 3 

У меня есть следующие классы, базы, А и В, подклассов базы. Каждый с оператором >> перегружен.

Проблема в функции 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

Вы должны объявить 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

Я предполагаю, что вы имели в виду Base * pO – sara

+0

Да, я пропустил декларации и подумал, что B является подклассом A. – Joni

+0

Это сделало это, спасибо. Вы знаете, нужно ли мне удалять эти объекты вручную или они умирают, когда векторные объекты умирают? – user2287453

0

И ответ на другой вопрос, «мне нужно удалить объекты вручную» это да, объекты наделяются new всегда необходимо удалить с помощью delete.

Однако, поскольку вы нажимаете указатели на массив, убедитесь, что вы не удаляете их слишком рано, когда они все еще используются!

Таким образом, одним альтернативным решением было бы не использовать указатели. Сделайте obj массив Base, а не массив Base* и избегайте любых new или delete.

Edit:
Без указателей, я бы писать что-то вроде этого:

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); 
    } 
} 

, но убедитесь, что не вызывает никакого объекта нарезку путем добавления переменных-членов либо класса А или класса B!

+0

Я с удовольствием сделаю это, но как это будет выглядеть в load()? Я пошел с указателями, думая, что у меня не может быть вектор , заполненный A и B. – user2287453

+0

ОК, я редактировал. Но я просто понимаю, что с массивом Base вы бы нарезали свои объекты. Поэтому, если вы планируете добавлять переменные-члены в свой класс, добавьте их в базовый класс, а не в производные классы! (Или придерживайтесь указателей, но не забудьте удалить их перед удалением вектора 'objs'.) –

Смежные вопросы