使用 const 引用初始化成员数据
Init members data with const reference
我想创建一个基本的 class PElement<T>
。为了实现我的链表,我希望那个对象 PElement<T>
有一个指向下一个 PElement<T>
的指针和一个指向值的指针,它是 T.
的一个实例
这是我写的:
template<class T>
class PElement {
public:
//Données membre
PElement * s;
T * v;
//Constructeur
PElement(
const PElement * suivant,
const T *valeur
):s(suivant),v(valeur){}
};
这就是我在 main.cpp
文件中创建对象的方式:
//Test PElement<Double>
PElement<double> * l1;
double *a = new double(2);
double *b = new double(5);
double *c = new double(7.5);
double *d = new double(9);
l1 = new PElement<double>(new PElement<double>(new PElement<double>(new PElement<double>(NULL, d), c), b), a);
//Test PElement<String>
PElement<string> * l2;
string *e = new string("Carotte");
string *f = new string("Cerise");
string *g = new string("Orange");
l2 = new PElement<string>(new PElement<string>(new PElement<string>(NULL, g), f), e);
最后这是我得到的错误:
error C2440: 'initializing' : cannot convert from 'const PElement<double> *' to 'PElement<double> *'
error C2439: 'PElement<double>::s' : member could not be initialized
(和第二个参数v一样的两个错误(v为value))
我的代码有什么问题,我该如何解决?
你的构造函数:
//Constructeur
PElement( const PElement * suivant, const T *valeur)
:s(suivant)
,v(valeur)
{}
尝试用 suivant
初始化 s
即 PElement*
const PElement*
.
C++ 不允许。这样做是错误的,因为 const PElement*
表示指向的对象是不可变的,而 PElement*
表示指向的对象是可变的。
您的初始化试图失去不变性限定符。
您可以通过向构造函数接受非常量值来立即修复它:
//Constructeur
PElement( PElement* suivant, T* valeur)
:s(suivant)
,v(valeur)
{}
然而,我们大多不使用 C++ 创建自己的链表。相反,我们使用
std::list<double>
或 std::list<std::string>
当我们需要双精度或字符串的链表时。
我想创建一个基本的 class PElement<T>
。为了实现我的链表,我希望那个对象 PElement<T>
有一个指向下一个 PElement<T>
的指针和一个指向值的指针,它是 T.
这是我写的:
template<class T>
class PElement {
public:
//Données membre
PElement * s;
T * v;
//Constructeur
PElement(
const PElement * suivant,
const T *valeur
):s(suivant),v(valeur){}
};
这就是我在 main.cpp
文件中创建对象的方式:
//Test PElement<Double>
PElement<double> * l1;
double *a = new double(2);
double *b = new double(5);
double *c = new double(7.5);
double *d = new double(9);
l1 = new PElement<double>(new PElement<double>(new PElement<double>(new PElement<double>(NULL, d), c), b), a);
//Test PElement<String>
PElement<string> * l2;
string *e = new string("Carotte");
string *f = new string("Cerise");
string *g = new string("Orange");
l2 = new PElement<string>(new PElement<string>(new PElement<string>(NULL, g), f), e);
最后这是我得到的错误:
error C2440: 'initializing' : cannot convert from 'const PElement<double> *' to 'PElement<double> *'
error C2439: 'PElement<double>::s' : member could not be initialized
(和第二个参数v一样的两个错误(v为value))
我的代码有什么问题,我该如何解决?
你的构造函数:
//Constructeur
PElement( const PElement * suivant, const T *valeur)
:s(suivant)
,v(valeur)
{}
尝试用 suivant
初始化 s
即 PElement*
const PElement*
.
C++ 不允许。这样做是错误的,因为 const PElement*
表示指向的对象是不可变的,而 PElement*
表示指向的对象是可变的。
您的初始化试图失去不变性限定符。 您可以通过向构造函数接受非常量值来立即修复它:
//Constructeur
PElement( PElement* suivant, T* valeur)
:s(suivant)
,v(valeur)
{}
然而,我们大多不使用 C++ 创建自己的链表。相反,我们使用
std::list<double>
或 std::list<std::string>
当我们需要双精度或字符串的链表时。