类中的静态函数和数组

时间:2014-03-22 22:24:09

标签: c++ static static-methods

我在尝试编译下面的代码时喜欢5个错误。 它就像:它主要指向static string rzymstatic 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;
} 

我会感激帮助!我厌倦了一些事情,但仍然有很多错误。我想在不创建对象的情况下使用类中的元素。任何想法?

5 个答案:

答案 0 :(得分:1)

(也称为&#34;静态&#34;)与实例成员函数的交易是实例成员函数可以访问静态和实例成员(变量和函数),而静态成员函数只能访问静态成员。这就是你需要制作

的原因
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);

答案 1 :(得分: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) {
     // ...
}

请查看完全固定,可编辑且正在运行的示例here

答案 2 :(得分:0)

声明为static的方法无法访问类中的数据成员。 也许你应该放弃static到处都是什么?

答案 3 :(得分:0)

如果没有该类的对象,则无法从同一个类的静态方法访问类的非静态成员。非静态成员仅存在于对象的上下文中,并且不能从具有类范围的静态方法进行访问。

所以你要么:

  • 让所有成员保持静态
  • 使所有成员都是非静态的
  • 将对象传递给用于访问非静态成员的静态方法

另请注意,只有在声明函数时才需要static关键字,而不是在定义函数时。

答案 4 :(得分:0)

这是不可能的。静态方法只能访问其他共享内容(变量,其他方法等)。

实施例: 假设我们有一个Square类。您可以通过将高度和宽度传递给构造函数来创建对象。

Square mySquare(2,2)

Square类有一个获取对象区域的方法。所以你会这样称呼它:

double area = mySquare.getArea();

这是有效的,因为您正在使用特定对象的高度和宽度的实例变量来计算它。但是让我们说在创建对象之前我们想要计算一个正方形的面积以确保它有效。所以我们将调用Square类中的静态getArea(double w, double h)方法。

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

这很有效。但是,如果您尝试调用getArea()方法(没有参数)会给您一个错误,因为它不知道要使用的高度和宽度,因为它们还没有定义了。

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

希望这有帮助。