2017-02-11 2 views
-1

Как получить доступ к функции лобкового члена извне основного? Когда я напрямую вызываю функцию, используя «оператор точки», он показывает мне «Ошибка области». В нем указано, что имя объекта не было объявлено в этой области. Вот фрагменты моего кода.Как использовать объект за пределами основной функции в C++?

class laptop 
{ 
private: 
     int id,price,cpu,gpu,ram,size,qty; 
     char name[30]; 
    public: 
     laptop() : id(0),price(0),cpu(0),gpu(0),ram(0),size(0) {} 
     void add(int i,char n[],int p,int c,int r,int g,int s,int q) 
     { 
      id=i; std::strcpy(name,n); price=p; cpu=c; ram=r; gpu=g; size=s; qty=q; 
     } 
int qt() 
     { 
      return qty; 
     } 
}; 

Внутри внешней функции (а не функции члена) Я дал вызов функции, как

cout<<l[1].qt(); 

Он просто держит выскакивают эту ошибку. И да, я ЛУЧШЕ! Думаю, это показывает сам из моего кода. Заранее спасибо!

РЕДАКТИРОВАТЬ - Не знаете, в какой части вы просите. Так вот оно. Весь мой код:

#include <iostream> 
#include <cstring> 
#include <iomanip> 
//#include <string> 
using namespace std; 
char name[30],ip3; 
int ip1,ip2,i,cart[10][2],temp,id; 
static int count=0; 

int get_id(); 

class laptop 
{ 
    private: 
     int id,price,cpu,gpu,ram,size,qty; 
     char name[30]; 
    public: 
     laptop() : id(0),price(0),cpu(0),gpu(0),ram(0),size(0) {} 
     void add(int i,char n[],int p,int c,int r,int g,int s,int q) 
     { 
      id=i; std::strcpy(name,n); price=p; cpu=c; ram=r; gpu=g; size=s; qty=q; 
     } 
     void disp() 
     { 
      cout<<name<<endl<<"Processor-Intel Core i"<<cpu<<" ,RAM-"<<ram<<" GB, "<<gpu<<" GB Graphics, "<<size<<" inches HD display"<<endl; 
      cout<<"Price Rs."<<price<<endl; 
     } 
     void tab() 
     { 
      cout<<setw(1)<<id<<setw(22)<<name<<setw(17)<<"Intel Core i"<<cpu<<setw(7)<<ram<<" GB"<<setw(6)<<gpu<<" GB"<<setw(10)<<size<<" inches"; 
     } 
     int qt() 
     { 
      return qty; 
     } 
     void add() 
     { 
      cout<<l[2].qt(); 
     } 

}; 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */ 

int main() 
{ 
    laptop l[15]; 
    l[1].add(1001,"HP Pavillion 530",30000,5,4,1,15,10); 
    l[2].add(1002,"HP Pavillion 540",32000,5,6,1,15,11); 
    l[3].add(1003,"HP Pavillion 730",37000,7,8,2,15,4); 
    l[4].add(1004,"HP Pavillion 750",44000,7,16,2,17,10); 
    l[5].add(1005,"HP Pavillion 750+",49000,7,32,4,17,14); 
    l[6].add(1006,"Dell Vostro DV300",23000,3,4,1,13,2); 
    l[7].add(1007,"Dell Vostro DV301",25000,3,4,1,14,9); 
    l[8].add(1008,"Dell Vostro DV510",29000,5,4,1,15,18); 
    l[9].add(1009,"Dell Vostro DV710",44000,7,8,2,15,4); 
    l[10].add(1010,"Dell Vostro DV750",48000,7,16,2,17,3); 
    l[11].add(1011,"Lenovo Y300",27000,3,8,1,13,9); 
    l[12].add(1012,"Lenovo Y900",60000,7,16,4,17,2); 
    cout<<"Welcome to Walmart- The online electronic supermarket"<<endl; 
    cout<<"Walmart is a one-stop destination for all your digital needs"<<endl; 
    cout<<"Please enter your name"<<endl; 
    cin>>name; 
    cout<<"Welcome "<<name<<" to our brand new e-store"; 
    cout<<endl<<"We have laptops,tablets and desktops available in our store currently"<<endl; 
    cout<<"To go to the laptop store, press 1"<<endl<<"To go to the tablet store, press 2"<<endl<<"To go to the desktop store, press 3"; 
    cin>>ip1; 
    switch(ip1) 
    { 
    case 1: 
     cout<<"Press 1 for a tabulated view. Else press 2 for individual view"; 
     cin>>ip2; 
     switch(ip2) 
     { 
     case 1: 
      cout<<"Sl. no."<<setw(7)<<" Model Name"<<setw(20)<<"Processor"<<setw(13)<<"RAM"<<setw(14)<<"Graphics"<<setw(15)<<"Screen Size"<<endl; 
      for(i=1;i<13;i++) 
      { 
       l[i].tab(); 
       cout<<endl; 
      } 
      break; 
     case 2: 
      cout<<endl<<"Here's a list of all the models available with us"<<endl; 
      for(i=1;i<13;i++) 
      { 
      cout<<i<<") "; 
      l[i].disp(); 
      cout<<endl; 
      } 
      break; 
     } 
     cout<<"Are you interested in any of the above listed models? (Y/N)"<<endl; 
     cin>>ip3; 
     if(ip3=='N') 
     { 
      cout<<"Sorry!Please re visit the store soon for new models.Coming soon!"; 
      break; 
     } 
     id=get_id(); 
     cout<<"Please enter the quantity ("<<l[id].qt()<<" available in stock)"<<endl; 
     cin>>cart[count][1]; 
     if(cart[count][1]<=l[id].qt()) 
     cout<<"Item added to cart"; 
     else 
     cout<<"Error. Please recheck the quantity"; 
    } 

    return 0; 
} 

int get_id() 
{ 
    cout<<"Please enter the item id of the model that you are interested in"<<endl; 
    cin>>cart[count][0]; 
    temp=(cart[count][0])/1000; 
    if(temp==1) 
    return (cart[count][0])-1000; 
    else if(temp==2) 
    return (cart[count][0])-2000; 
} 
+0

http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list –

+0

Пожалуйста, напишите полный пример. Покажите свою основную и другую функцию. Мы должны скомпилировать код и получить ту же самую ошибку. –

+0

Скорее всего, вам необходимо передать параметр из основной в другую функцию. –

ответ

0

В вашей add функции является функция, вам не нужно вызывать qt() от него, как у вас есть

void add() 
{ 
    cout<<l[2].qt();  
} 

изменить его

void add() 
{ 
    cout<<qt();  
} 
+0

Итак, я должен передать объект в качестве аргумента? – Kathir

+0

вы тоже можете это сделать, и вы также можете создать объект внутри своей функции, не являющейся членом. – Yousaf

+0

Не могли бы вы рассказать? Может быть, привести пример? Не совсем тебя поняла. Я ученик. – Kathir

0

Scope Error означает, что ваше объявление не в том месте. Проверьте, где вы объявили объект.

+0

. Кажется, нет ошибки. Я загрузил весь код. Перепроверить – Kathir

0

Переменная l заявлена ​​исключительно в функции main, и, следовательно, она не «видима» за пределами main.

Ваше заявление cout<<l[2].qt() является частью функции члена add класса laptop, и, таким образом, выходит за рамки main:

void add() 
    { 
     cout<<l[2].qt(); 
    } 

Вы, наверное, имели в виду:

void add() 
    { 
     cout << this->qt(); 
    } 
+0

Могу ли я использовать оператор с разрешением области видимости и, возможно, дать ему видимость видимости внутри этой функции? – Kathir

+0

Нет. Оператор разрешения области действия '::' предназначен для устранения неоднозначности области, но он не может сделать переменную «видимой», если она выходит за пределы области видимости. Вам нужно будет сделать 'l' глобальную переменную, чтобы довести ее до объема функции-члена' add'. –

+0

Хорошо, тогда, пройдя ответы. Есть два способа, которыми я могу перейти теперь: 1) сделать его функцией-членом; 2) передать объект внешней функции. Я прав? – Kathir

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