0

How do I access a pubic member function from outside of main? When I directly call the function using the 'dot operator' it shows me "Scope error". It says that the object name was not declared under that scope. Here are the snippets of my code.

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

Inside the external function(not a member function) I gave the function call as

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

It just keeps popping that error. And yes, I AM A NEWBIE! I guess it shows for itself from my code. Thanks in advance!

EDIT- Not sure which part you are asking for. So here it is. My entire code:

#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;
}
Kathir
  • 1,282
  • 1
  • 15
  • 19
  • http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – πάντα ῥεῖ Feb 11 '17 at 20:14
  • Please post a complete example. Show your main and the other function. We should be able to compile the code and get the exact same error. – Code-Apprentice Feb 11 '17 at 20:14
  • Most likely, you need to pass a parameter from main to the other function. – Code-Apprentice Feb 11 '17 at 20:16
  • Your `laptop::add` function doesn't really make sense. It's not adding anything! And it's a method called on a particular instance of a `laptop` object but you somehow want it to be aware of an array of `laptop` instances located elsewhere in the program? Why? (You could pass the array to the function as a parameter, but I question that from a design standpoint.) – TheUndeadFish Feb 11 '17 at 20:21

2 Answers2

0

Scope Error means that your declaration is in the wrong place. Check where you declared the object.

0

Variable l is declared solely in function main, and thus it is not "visible" outside the scope of main.

Your statement cout<<l[2].qt() is part of a member function add of class laptop, and thus outside the scope of main:

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

You probably mean:

    void add()
    {
        cout << this->qt();
    }
Stephan Lechner
  • 34,891
  • 4
  • 35
  • 58
  • Can i use scope resolution operator and maybe give it scope visibility within this function too? – Kathir Feb 11 '17 at 20:37
  • No. scope resolution operator `::` is for resolving scope ambiguity, but it cannot make a variable "visible" if it is out of scope. You'd need to make `l` a global variable to bring it into the scope of member function `add`. – Stephan Lechner Feb 11 '17 at 20:55
  • Okay, then going by the answers. There are 2 ways that i can proceed now 1) make it a member function 2) pass the object to the outside function. Am i correct? – Kathir Feb 12 '17 at 02:46