2016-04-07 5 views
-4

Привет, ребята, с моим, как я начал изучать C++ вчера.'t' не был объявлен в этой области

Я хочу создать объекты, зависящие от значений, которые я читаю из файла. Однако он говорит, что значение t не объявлено в пределах области:

Также я понимаю, что способ, которым я выполняю свой код, не обязательно является лучшей практикой. В качестве общей концепции кодирования мне было интересно, как бы я инициализирует т заранее, так как объекты, которые я создаю, зависит от значения данного

Вот код:

while(getline(linestream,value,',')){ 
      if(i==0){ 
       cout<< "Type " << value << endl; 
       type = value; 
      } 
      else if(i==1){ 
       cout<< "Code " << value << endl; 
       code = value; 
      } 
      else if (i==2){ 
       cout << "Count " << value << endl; 
       count = atoi(value.c_str()); 
      } 
      else if (i ==3){ 
       cout << "Price " << value << endl; 
       price = atoi(value.c_str()); 
      } 
      else if(i ==4){ 
       cout << "Other " << value << endl; 
       other = value; 
      } 
      i++; 
      if(i ==5){ 
       if(type == "transistor"){ 
        Transistor *t = new Transistor(code,count,price,other); 
       }else if (type == "IC"){ 
        IC *t = new IC(code,count,price,other); 
       }else if (type == "resistor"){ 
        Resistor *t = new Resistor(code,count,price,other); 
       }else if (type == "capacitor"){ 
        Capacitor *t = new Capacitor(code,count,price,other); 
       }else{ 
        Diode *t = new Diode(code,count,price,other); 
       } 

       if(counter ==0){ 
        LinkedList list(t); 
       }else{ 
        list.tailAppend(t); 
       } 
      } 
     } 

Кроме того, все классы, которые я Создание потенциальных объектов для всех происходит из базового класса StockItem

+1

«Транзистор», «Резистор» и т. Д. Все подклассы некоторого класса (например, «Компонент»)? Если это так, тогда вы можете объявить 'Компонент * t' перед проверками' if', а затем использовать полиморфизм для инициализации этого в зависимости от выполняемого оператора 'if'. – ArchbishopOfBanterbury

+0

Да @ArchbishopOfBanterbury (любят имя btw) все они производны от базового класса, но его абстрактный базовый класс – Blarsssss

+1

@Blarsssss. Все в порядке, вы все же можете создать указатель на этот базовый класс и затем назначить ему экземпляр производного класс, как вы это делали в проверках 'if', например: declare' Base * t', а затем введите 't = новый Transistor (...)' и т. д. для каждого if-statement. – ArchbishopOfBanterbury

ответ

2

t не подходит для использования. Вы объявили его в блоке после операторов (0) if. Вместо этого вы должны объявить его как базовый класс перед блоками кода и инициализировать его дочерними классами после каждого оператора if (который вы действительно должны использовать вместо switch, но это не кодекс)

+1

Существует также та же проблема с 'list'. – SergeyA

+0

получение недопустимого нового выражения абстрактного типа класса – Blarsssss

+0

@Blarsssss, что? –

1

В C++ все циклы и if статьи имеют свой собственный объем. Поэтому вы должны объявить t вне статей if, и вы должны объявить list вне цикла. Кроме того, C++ - это язык со строгими типами переменных, поэтому вы не можете изменить тип t, и вы не можете вставлять значения разных типов в список. Для этого вы должны либо использовать указатели void* без типа, либо создать родительский класс и вывести все типы, которые вы используете для t из этого класса (тогда вы используете в этом случае указатель на базовый класс для t). Если вы не знаете, как это сделать, вам лучше прочитать некоторые книги по объектно-ориентированному программированию на C++, это слишком обширная тема, чтобы объяснить в этом ответе.

Полезная книга на эту тему могла бы быть одной из книг Бьярна Страуступа, найденной, например, here.

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