C++ 使用重载运算符()访问类中的静态数组

C++ 使用重载运算符()访问类中的静态数组,c++,C++,我是新来的,所以我希望我能写一个可以理解的问题 我的问题是,如何使用重载运算符()访问类中的静态数组 Main.cpp: class SomeClass { public: static const int a[2][2]; const int& operator() (int x, int y) const; }; 在它下面,我定义了数组a: const int SomeClass::a[2][2] = {{ 1, 2 }, { 3, 4 }}; 下面是重载运算符

我是新来的,所以我希望我能写一个可以理解的问题

我的问题是,如何使用重载运算符()访问类中的静态数组

Main.cpp:

class SomeClass
{
public:
    static const int a[2][2];

    const int& operator() (int x, int y) const;
};
在它下面,我定义了数组a:

const int SomeClass::a[2][2] = {{ 1, 2 }, { 3, 4 }};
下面是重载运算符:

const int& SomeClass::operator() (int x, int y) const
{
    return a[x][y];
}
在main()中,我想通过使用shloudl返回4的
SomeClass(1,1)
访问'a'2D数组。但当我尝试像这样编译main时:

int main(void)
{
    cout << SomeClass(1, 1) << endl;

    return 0;
}
我意识到我不知道问题出在哪里。似乎有一个类的构造函数。看起来我是在构造类而不是访问数组

这是什么意思?是否有任何方法可以这样处理数组,或者最好打破封装规则并将其定义为全局数组?这是否意味着不能使用重载运算符访问静态数组

当我这样做时,它编译为OK:

int main(void)
{
    SomeClass class;
    cout << class(1, 1) << endl;

    return 0;
}
int main(无效)
{
某类;

cout您需要实例化类的对象以访问其成员。请尝试使用

cout << SomeClass()(1, 1) << endl;

cout您无法生成静态的
操作符()
。语法
SomeClass(1,1)
试图调用不存在的构造函数,该构造函数包含两个整数。您必须有一个对象实例来调用
操作符()
,就像您在第二个示例中所做的那样(除了
class
是一个关键字)。

不能重载运算符并使其成为静态的

也就是说,您可以重载运算符并从类型为
SomeClass
的对象访问成员:

SomeClass s;
s(1,2);

您的代码> const int & MeCasLas::(操作程序)(int x,int y)const 不是静态操作符…C++标准不允许它被声明为代码> static < /代码>。因此,它必须与< SomeClass > <代码>的实例相关联,以便调用。< /P>

cout << SomeClass(1, 1) << endl;

注意:当你指的是
'\n'

时,千万不要使用
endl
,如果你很狡猾,这是可以做到的,但它很难看。添加一个变量来保存最后的结果,一个基于
x
y
参数设置该变量的构造函数,以及一个运算符int()进行转换。您可能希望重载运算符,或者第二个代码段无法编译。
class
是一个关键字。@delnan-哦,是的,很抱歉,我已经编写了我想到的第一个。非常感谢,它可以工作。如果我现在理解了,这是否意味着“static”关键字表示数组将在程序的开始?但在本例中,在
SomeClass()(1,1)
中再次创建它意味着它再次分配是为了
cout
的目的,此时,它在操作内存中存在两次,是吗?@Mimars:No。数组是静态的,只分配了一次,但操作符()是一个非静态成员函数(与所有运算符重载一样),因此需要使用实例。在您的情况下,实例为空(无数据),但仍然需要。哇,很酷。我知道我为什么决定学习编程…再次感谢您的快速回复,您的答案已经足够了。感谢您的回复,我将其保存到我的有趣编程方面文件夹中,但对于大多数项目,我可能会使用常规的
SomeClass;
,而不是像刚才解释的那样使用它。Ye啊,我强烈推荐Rob和Thanon的答案。这只是一个巧妙的把戏。+ 1我只是想张贴同样的事情。滥用C++:)但不要这样做,除非它是为了好玩:谢谢。还有一个问题-为什么你不建议使用
endl
,而是
\n
?我读到它很好,因为它还刷新输出流。@Mimars-它不好,因为它也刷新输出流,这相对比较昂贵。许多人总是在每一行的末尾都使用
endl
。这使得他们的将大型输出集写入磁盘时,程序运行v-e-r-y s-l-o-w-l-y。
cout << SomeClass(1, 1) << endl;
cout << SomeClass()(1,1) << "\n";
class SomeClass
{
public:
    static const int a[2][2];
    mutable int result;

    SomeClass() {}
    SomeClass(const SomeClass& r) :result(r.result) {}
    SomeClass(int x, int y) :result(a[x][y]) {}
    int operator() (int x, int y) const {return result=a[x][y];}
    operator int() const {return result;}
    friend ostream& operator<<(ostream& o, const SomeClass& r) {return o<<r.result;}
};
const int SomeClass::a[2][2] = {{ 1, 2 }, { 3, 4 }};