如何在索引运算符的代理上使用赋值运算符
How to use assignment operator on proxy of index operator
在下面的代码中,我制作了一个模板 class,它在主函数中进行了初始化,我正在尝试分配 char*
,如下所示,但它不起作用。我认为问题出在我在 Proxy class 中定义的赋值运算符函数中,但我无法弄清楚
#include <iostream>
using namespace std;
template <class T>
class Vector {
public:
T *p;
Vector(int size) {
p = new T[size];
}
class Proxy {
Vector &a;
int i;
public:
Proxy(Vector &a, int i) : a(a), i(i) {
}
void operator=(const T x) {
a.p[i] = x;
}
};
Proxy operator[](int i) {
return Proxy(*this, i);
}
};
int main() {
Vector<char *> sv1(2);
sv1[0] = "John";
sv1[1] = "Doe";
}
我遇到以下错误;
我已经尝试将赋值运算符函数中的参数设置为 const
,我还尝试隐式类型转换为 T
没有任何效果
您在编写代码时会遇到同样的错误:
char * whatever = "something";
这段代码至少对于字符串是绝对错误的:
void operator=(const T x)
{
a.p[i] = x;
}
第一步:分配缓冲区;
第 2 步:将字符串复制到分配的缓冲区。
您的代码适用于 char、int 等原语。以下代码应该有效:
int main() {
Vector<char> sv1(2);
sv1[0] = 'J';
sv1[1] = 'D';
}
试试这个:
using namespace std;
template <class T>
class Vector {
public:
T* p;
int sz;
Vector(int size) {
p = new T[size];
sz = size;
}
template<class T>
class Proxy {
Vector<T>& v;
int i;
public:
Proxy(Vector<T>& vec, int index) :v(vec),i(index) { }
void operator= (const T val) { v.p[i] = val; }
};
Proxy<T> operator[](int index) { return Proxy<T>(*this, index); }
};
您的代码适用于任何基本类型(int
、char
、double
)和指针,但不适用于以下示例:
int main() {
Vector<char*> sv1(2);
sv1[0] = "John";
sv1[1] = "Doe";
}
首先,Vector 指向一个 char*
,而不是字符串文字 (const char*
)。您必须使用 C 风格的转换或 const_cast
来转换它。示例:
int main() {
Vector<char*> sv1(2);
sv1[0] = const_cast<char*>("John"); //succeeds
sv1[1] = (char*)"Doe"; //succeeds
sv1[0] = "John"; //fails
sv1[1] = "Doe"; //fails
}
在 C++ 中,字符串文字始终是 const char*
。
在下面的代码中,我制作了一个模板 class,它在主函数中进行了初始化,我正在尝试分配 char*
,如下所示,但它不起作用。我认为问题出在我在 Proxy class 中定义的赋值运算符函数中,但我无法弄清楚
#include <iostream>
using namespace std;
template <class T>
class Vector {
public:
T *p;
Vector(int size) {
p = new T[size];
}
class Proxy {
Vector &a;
int i;
public:
Proxy(Vector &a, int i) : a(a), i(i) {
}
void operator=(const T x) {
a.p[i] = x;
}
};
Proxy operator[](int i) {
return Proxy(*this, i);
}
};
int main() {
Vector<char *> sv1(2);
sv1[0] = "John";
sv1[1] = "Doe";
}
我遇到以下错误;
我已经尝试将赋值运算符函数中的参数设置为 const
,我还尝试隐式类型转换为 T
没有任何效果
您在编写代码时会遇到同样的错误:
char * whatever = "something";
这段代码至少对于字符串是绝对错误的:
void operator=(const T x)
{
a.p[i] = x;
}
第一步:分配缓冲区; 第 2 步:将字符串复制到分配的缓冲区。
您的代码适用于 char、int 等原语。以下代码应该有效:
int main() {
Vector<char> sv1(2);
sv1[0] = 'J';
sv1[1] = 'D';
}
试试这个:
using namespace std;
template <class T>
class Vector {
public:
T* p;
int sz;
Vector(int size) {
p = new T[size];
sz = size;
}
template<class T>
class Proxy {
Vector<T>& v;
int i;
public:
Proxy(Vector<T>& vec, int index) :v(vec),i(index) { }
void operator= (const T val) { v.p[i] = val; }
};
Proxy<T> operator[](int index) { return Proxy<T>(*this, index); }
};
您的代码适用于任何基本类型(int
、char
、double
)和指针,但不适用于以下示例:
int main() {
Vector<char*> sv1(2);
sv1[0] = "John";
sv1[1] = "Doe";
}
首先,Vector 指向一个 char*
,而不是字符串文字 (const char*
)。您必须使用 C 风格的转换或 const_cast
来转换它。示例:
int main() {
Vector<char*> sv1(2);
sv1[0] = const_cast<char*>("John"); //succeeds
sv1[1] = (char*)"Doe"; //succeeds
sv1[0] = "John"; //fails
sv1[1] = "Doe"; //fails
}
在 C++ 中,字符串文字始终是 const char*
。