C++ 使用重载运算符()访问类中的静态数组
我是新来的,所以我希望我能写一个可以理解的问题 我的问题是,如何使用重载运算符()访问类中的静态数组 Main.cpp: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 }}; 下面是重载运算符
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 }};