user3402584
user3402584

Reputation: 410

Static functions and arrays in a class

i have like 5 erros when trying to compile the code below. it's like:THey are mainly pointing on static string rzym and static int arab. the main errors: In arab2rzym function:

 - : invalid use of member ‘RzymArab::arab’ in static member function
 - : error: from this location
 - : error: invalid use of member ‘RzymArab::arab’ in static member function  
 - : invalid use of member ‘RzymArab::rzym’ in static member function
 - : cannot declare member function ‘static std::string RzymArab::arab2rzym(int)’ to have static linkage [-fpermissive]

Here is the code:

#include <iostream>
#include <string>

using namespace std;

class RzymArab 
{
    private:
            string rzym[13] = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
            int arab[13] = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
    public:
        static int rzym2arab(string);
        static string arab2rzym(int);
};

static string RzymArab::arab2rzym(int x) 
{
    int i=12;
    string s="";

    while(x>=1) 
    {
        if(x>=arab[i])
            {
            x-=arab[i];
            s=s+rzym[i];
            }
        else
            i-=1;
    }
    return s;
}       

int main() 
{
    string x;
    x=RzymArab.arab2rzym(1164);
    cout<<x<<endl;
    return 0;
} 

I would be grateful for helping!I tired some things but still bunch of errors. I want to use elements from class without creating an object.Any ideas?

Upvotes: 0

Views: 755

Answers (5)

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726509

The deal with class (also known as "static") vs. instance member functions is that an instance member function can access both static and instance members (variables and functions), while static member functions can access only static members. That is why you need to make the

int arab[13]; // The initializer needs to go into cpp file
string rzym[13];

member static in the class:

static int arab[13];
static string rzym[13];

The initializer needs to go to the cpp file:

// This goes into the CPP file
int RzymArab::arab[13] = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
string RzymArab::rzym[13] = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};

Finally, you refer to static members with the scope resolution operator ::, not with a dot:

x=RzymArab::arab2rzym(1164);

Upvotes: 1

πάντα ῥεῖ
πάντα ῥεῖ

Reputation: 1

You can't access non static class member variables from static member functions. You'll need to make them static also:

class RzymArab {
private:
    static string rzym[13];
    static int arab[13];
public:
   static int rzym2arab(string);
   static string arab2rzym(int);
};

Also those need to be defined separately (in your class' .cpp file usually):

string RzymArab::rzym[13] = 
    {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
int RzymArab::arab[13] = {1,4,5,9,10,40,50,90,100,400,500,900,1000};

Additionally note you don't use the static keyword for the (non inline) definition of your static function (it's invalid syntax). Just write:

string RzymArab::arab2rzym(int x) {
     // ...
}

See the fully fixed, compilable and running sample here please.

Upvotes: 1

Josh Braun
Josh Braun

Reputation: 490

It isn't possible. A static method can only access other shared things (variables, other methods, etc.).

Example: Say we have a Square class. You can create an object by passing the height and width into the constructor.

Square mySquare(2,2)

The Square class has a method for getting the area of the object. So you would call it as so:

double area = mySquare.getArea();

That works and all because you are using the instance variables for that specific object's height and width to calculate it. But lets say we want to calculate the area of a square before we create the object to make sure it's valid. So we would call the static getArea(double w, double h) method that is in the Square class.

double area = Square.getArea(2,4);

This works. But if you tried to call the getArea() method (that doesn't have parameters) would give you an error because it wouldn't know what height and width to use because they haven't been defined yet.

double area = Square.getArea(); //This will give you an error.

Hope this helps.

Upvotes: 0

Marius Bancila
Marius Bancila

Reputation: 16318

You cannot access non-static members of a class from a static method of the same class without an object of that class. Non-static members exist only within the context of an object and cannot be access from static methods, that have class scope.

So you either:

  • make all members static
  • make all members non-static
  • pass an object to the static methods used to access the non-static members

Also notice that the static keyword is only necessary when declaring the function, not when you define it.

Upvotes: 0

Klaas van Aarsen
Klaas van Aarsen

Reputation: 474

I method that is declared static cannot access data members in the class. Perhaps you should drop static everywhere?

Upvotes: 0

Related Questions