使用 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 初始化 sPElement* const PElement*.

C++ 不允许。这样做是错误的,因为 const PElement* 表示指向的对象是不可变的,而 PElement* 表示指向的对象是可变的。

您的初始化试图失去不变性限定符。 您可以通过向构造函数接受非常量值来立即修复它:

//Constructeur
PElement( PElement* suivant, T* valeur)
    :s(suivant)
    ,v(valeur)
{}

然而,我们大多不使用 C++ 创建自己的链表。相反,我们使用 std::list<double>std::list<std::string> 当我们需要双精度或字符串的链表时。