2016-03-03 10 views
2

Что бы я хотел сделать, это передать const ListeBase<int> *pListe в моем членском инициализаторе, как то, что находится в моем .cxx, но он дает мне ошибку, говоря, что он не может конвертировать из 'const' в 'not const'C++: передача const * p в список инициализации

Я знаю, что могу передать его без использования 'const', но мне сказали, что это хорошая привычка размещать const до переменной, которую вы не собираетесь менять ... Итак, в чем причина того факта, что я не может передать const в мой член инициализатор? : P

#include "DataSource.h" 
#include "ListeBase.h" 


class DataSourceSerieDiscrete : public DataSource 
{ 
private : 
    ListeBase<int> *pListe; 

public : 
    //CONSTRUCTORS 
    DataSourceSerieDiscrete(); 
    DataSourceSerieDiscrete(const ListeBase<int> *pListeSai); 
    DataSourceSerieDiscrete(const DataSourceSerieDiscrete &DSSDSai); 

    //SETTERS 
    void setPListe(const ListeBase<int> *pListeSai); 

    //GETTERS 
    const ListeBase<int> *getPListe() const; 
}; 

.cxx

#include "DataSourceSerieDiscrete.h" 

DataSourceSerieDiscrete::DataSourceSerieDiscrete() : pListe(NULL) {}; 
DataSourceSerieDiscrete::DataSourceSerieDiscrete(const ListeBase<int> *pListeSai) : pListe(pListeSai) {}; 
DataSourceSerieDiscrete::DataSourceSerieDiscrete(const DataSourceSerieDiscrete &DSSDSai) : pListe(DSSDSai.getPListe()) {}; 

//SETTERS 
void DataSourceSerieDiscrete::setPListe(const ListeBase<int> *pListeSai) 
{ 
    pListe = pListeSai; 
} 

const ListeBase * DataSourceSerieDiscrete<type>::getPListe() const 
{ 
    return pListe; 
} 

Сообщение об ошибке:

g++ DataSourceSerieDiscrete.cxx -c 
DataSourceSerieDiscrete.cxx: In constructor ‘DataSourceSerieDiscrete::DataSourceSerieDiscrete(const ListeBase<int>*)’: 
DataSourceSerieDiscrete.cxx:4:101: error: invalid conversion from ‘const ListeBase<int>*’ to ‘ListeBase<int>*’ [-fpermissive] 
DataSourceSerieDiscrete::DataSourceSerieDiscrete(const ListeBase<int> *pListeSai) : pListe(pListeSai) {}; 
                            ^

же ошибка конструктора копирования

DataSourceSerieDiscrete.cxx: In copy constructor ‘DataSourceSerieDiscrete::DataSourceSerieDiscrete(const DataSourceSerieDiscrete&)’: 
DataSourceSerieDiscrete.cxx:5:117: error: invalid conversion from ‘const ListeBase<int>*’ to ‘ListeBase<int>*’ [-fpermissive] 
DataSourceSerieDiscrete::DataSourceSerieDiscrete(const DataSourceSerieDiscrete &DSSDSai) : pListe(DSSDSai.getPListe()) {}; 
                                ^
+0

'Const ListeBase * pListeSai' является (изменяемые) указатель на константные ListBase , против' ListeBase * pListe; ': а (изменяемые) указатель (изменяемые) ListBase . – melak47

+0

Никогда не слышал о изменяемых указателях, я сделаю некоторые исследования об этом: P –

+0

Я просто использовал mutable здесь, чтобы обозначить отсутствие const. – melak47

ответ

0

Вы назначаете указатель на константу переменной-указателем не const, это не сработает. Вы должны объявить свой член как

const ListeBase<int> *pListe; 
+0

Хорошо, я думал, что мы могли бы назначать задания из const неконстантно или это специфично для указателей? –

+0

Y indded, я просто прочитал больше о предмете, я думаю, что получил его;) Спасибо! –

+0

Подумайте о различии между const T * ptr (указатель на неизменяемое значение типа T) и T * const ptr (неизменяемый указатель на значение типа T). Последний можно назначить на его изменяемый аналог, как и любую переменную, отличную от указателя, а первая - нет. –

0

const type * является указателем на объект const. Вы получаете указатель на объект const и пытаетесь использовать его указатель на обычный объект, и это то, что компилятор запрещает.

Я предлагаю вам прочитать нить здесь - http://stackoverflow.com/questions/1143262/what-is-the-difference-between-const-int-const-int-const-and-int-const

Удачи!

+0

Хорошо спасибо, я прочитаю это;) –