Статические функции и массивы в классе

0

У меня есть 5 erros при попытке скомпилировать приведенный ниже код. это похоже: THey в основном указывают на static string rzym и static int arab. основные ошибки: в функции arab2rzym:

 - : 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]

Вот код:

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

Я был бы благодарен за помощь! Я устал от некоторых вещей, но все еще куча ошибок. Я хочу использовать элементы класса без создания объекта.

Теги:
static
static-methods

5 ответов

1
Лучший ответ

Вы не можете получить доступ к нестационарным переменным-членам класса из статических функций-членов. Вам также понадобится сделать их статичными:

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

Также они должны быть определены отдельно (обычно в файле .cpp вашего класса):

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

Кроме того, обратите внимание, что вы не используете static ключевое слово для (не встроенного) определения вашей статической функции (это недопустимый синтаксис). Просто пиши:

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

См. Полностью фиксированный, компилируемый и работающий образец здесь, пожалуйста.

  • 0
    я не понимаю, сначала вы инициализируете массив rzym, и они выполняют функцию arrab2rzym. Как насчет второго массива?
  • 0
    @ user3402584 К сожалению, я немного испортил код во время редактирования (из-за путаницы). Исправлено.
Показать ещё 5 комментариев
1

Сделка с классами (также известными как "статические") против функций-членов экземпляра заключается в том, что функция-член экземпляра может обращаться к статическим элементам и членам экземпляра (переменные и функции), тогда как функции статических членов могут обращаться к статическим членам. Вот почему вам нужно сделать

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

член static в классе:

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

Инициализатор должен перейти в файл cpp:

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

Наконец, вы ссылаетесь на статические члены с оператором разрешения области ::, а не с точкой:

x=RzymArab::arab2rzym(1164);
  • 0
    все еще есть ошибка, что не статическая связь
  • 0
    @ user3402584 Можете ли вы опубликовать обновленный код, скажем, на pastebin.com?
Показать ещё 2 комментария
0

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

Таким образом, вы либо:

  • сделать все элементы статичными
  • сделать все члены нестационарными
  • передать объект статическим методам, используемым для доступа к нестационарным элементам

Также обратите внимание, что ключевое слово static необходимо только при объявлении функции, а не при ее определении.

0

I, который объявлен static не может получить доступ к элементам данных в классе. Может быть, вы должны сбросить static повсюду?

0

Это невозможно. Статический метод может использовать только другие общие вещи (переменные, другие методы и т.д.).

Пример. Скажем, у нас есть квадратный класс. Вы можете создать объект, передав высоту и ширину в конструктор.

Square mySquare(2,2)

Класс Square имеет метод получения области объекта. Поэтому вы бы назвали это так:

double area = mySquare.getArea();

Это работает и все потому, что вы используете переменные экземпляра для этой конкретной высоты и ширины объекта для ее вычисления. Но скажем, мы хотим вычислить площадь квадрата, прежде чем мы создадим объект, чтобы убедиться, что он действителен. Таким образом, мы бы назвали статический getArea(double w, double h) который находится в классе Square.

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

Это работает. Но если вы попытались вызвать метод getArea() (у которого нет параметров), вы получите сообщение об ошибке, потому что он не будет знать, какую высоту и ширину использовать, поскольку они еще не определены.

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

Надеюсь это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню