在课堂上,我们被要求写一部分代码来做一些老师写的工作。问题是,我不认识语法。我问过一位朋友,他说这可能是一个超载的运营商,但我不知道该去哪里。
templateClass < int > obj(array, arrayS);
cout << obj[1] << endl;
所以它似乎应该输出数组obj的插槽1将保持,但正如我所说,我从来没有见过这在没有()和参数之前使用过。
这会重载[]运算符吗?它如何应用于整个对象?
谢谢。
答案 0 :(得分:3)
templateClass < int > obj(array, arrayS);
与int obj(5);
的语法相同。
这意味着我们正在声明一个对象obj
。类型为templateClass<int>
,初始值设定项为array
和arrayS
,最终将作为类构造函数的参数。
obj[1]
表示在operator[]
上调用重载的obj
。要查看其实际功能,您需要查找templateClass
的类定义。 (或者如果你应该让obj[1]
工作,你需要在operator[]
的类定义中写一个重载的templateClass
。
答案 1 :(得分:0)
以下面的课程
为例template <typename T>
class SimpleArray {
public:
SimpleArray(const T& first_in = T(), const T& second_in = T()) :
first(first_in), second(second_in) { }
T& get(int index) {
return (index == 0) ? (first) : (second);
}
private:
T first;
T second;
};
并假设主要有
int main() {
SimpleArray<int> simple(1,2);
cout << simple.get(0) << ' ' << simple.get(1) << endl;
return 0;
}
所以这只是创建一个'SimpleArray'类型的对象,T
为int
(将1和2作为其构造函数的参数传递。然后你只需要进行get()
次调用在一个简单的三元运算符的帮助下返回所要求的元素。现在你可以重载[]
运算符
template <typename T>
class SimpleArray {
public:
SimpleArray(const T& first_in = T(), const T& second_in = T()) :
first(first_in), second(second_in) { }
T& get(int index) {
return (index == 0) ? (first) : (second);
}
T& operator[] (int index) {
return this->get(index);
}
private:
T first;
T second;
};
并在主
中测试int main() {
SimpleArray<int> simple(1,2);
cout << simple.get(0) << ' ' << simple.get(1) << endl;
cout << simple[0] << ' ' << simple[1] << endl;
return 0;
}
再次在此处,您只需在每次使用get()
语法访问数组元素时调用[]
函数
答案 2 :(得分:0)
我读了这样的作业:
编写一个接受这些行的模板类:
templateClass < int > obj(array, arrayS);
cout << obj[1] << endl;
第一行是一个构造函数,它接受参数,int作为模板类型,第二行是[]运算符。
但是对模板的功能没有特定要求。换句话说,只要构造函数接受两个参数(和模板类型为int)并且模板类提供[]运算符,您就可以使用您的想象力并实现您喜欢的任何内容。
查看变量名称(数组,数组),老师希望您传递一个数组和数组的大小。因此,templateClass的一个想法可能是将c样式数组作为输入并将值存储到某个c ++容器中的类。
可以这样做:
template <typename T>
class templateClass {
public:
// Constructor taking array T[] and size as arguments (first requirement)
templateClass(const T d[], const size_t size)
{
for (int i=0; i < size; i++)
{
// Copy data from c-style array to a c++ vector
mData.push_back(d[i]);
}
}
// [] operator (second requirement)
T& operator[] (int index)
{
if ((index >= mData.size()) || (index < 0))
{
// Error - out of range
// You could throw an exception here or some other error handling
throw std::invalid_argument( "Invalid index" );
}
return mData[index];
}
private:
std::vector<T> mData;
};
int main()
{
try
{
int arr[3] = {5, 4, 9};
templateClass < int > obj(arr, sizeof(arr)/sizeof(arr[0]));
cout << obj[0] << endl;
cout << obj[1] << endl;
cout << obj[2] << endl;
// Invalid index - will throw exception
cout << obj[3] << endl;
}
catch(...)
{
cout << "Exception....";
}
return 0;
}