У меня есть 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;
}
Я был бы благодарен за помощь! Я устал от некоторых вещей, но все еще куча ошибок. Я хочу использовать элементы класса без создания объекта.
Вы не можете получить доступ к нестационарным переменным-членам класса из статических функций-членов. Вам также понадобится сделать их статичными:
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) {
// ...
}
См. Полностью фиксированный, компилируемый и работающий образец здесь, пожалуйста.
Сделка с классами (также известными как "статические") против функций-членов экземпляра заключается в том, что функция-член экземпляра может обращаться к статическим элементам и членам экземпляра (переменные и функции), тогда как функции статических членов могут обращаться к статическим членам. Вот почему вам нужно сделать
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);
Вы не можете получить доступ к нестационарным членам класса из статического метода того же класса без объекта этого класса. Нестатические члены существуют только в контексте объекта и не могут быть доступны из статических методов, имеющих класс.
Таким образом, вы либо:
Также обратите внимание, что ключевое слово static необходимо только при объявлении функции, а не при ее определении.
I, который объявлен static
не может получить доступ к элементам данных в классе. Может быть, вы должны сбросить static
повсюду?
Это невозможно. Статический метод может использовать только другие общие вещи (переменные, другие методы и т.д.).
Пример. Скажем, у нас есть квадратный класс. Вы можете создать объект, передав высоту и ширину в конструктор.
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.
Надеюсь это поможет.