2015-07-06 5 views
2

Прошу прощения, если этот вопрос был дан ответ раньше, я не мог найти ответ нигде.Константа C++ по заданию

У меня возникли проблемы с соблюдением корректности константы.

У меня следующие определения.

struct C { 
    int x,y; 
}; 

class A { 
public: 
    C c;  
    C& getC() { return c; } 
}; 

class B { 
public: 
    void forwardInfo(const A& a) const { 
    const C& c = a.getC(); // <= compiler complains here 
    daoObject.updateTableX(c.x,c.y); 
    } 
}; 

Компилятор жалуется, что объект а является Const и, следовательно, не может вызывать a.getC(), так как этот способ не Const.

Однако я присваиваю результат константной ссылке. Прямо сейчас я просто бросить объект не ссылка сопзЬ так:

const C& c = ((A&)a).getC(); 

Это работает, но не элегантно. Есть ли лучший способ без изменения константы. Я считаю, что для объекта A возвращение C как not const является разумным, поскольку оно предназначено для изменения.

Также forwardInfo должен быть const, так как я не хочу ничего менять.

Я не уверен, почему компилятор не позволяет мне делать это, и есть ли лучший способ?

Ps. Я мог бы использовать методы getter/setter, но класс C предназначен для использования в качестве ведра данных для передачи в базу данных.

спасибо.

Исправлено: расположение кронштейна в отливке и неправильном литье.

+3

Внесите результат в 'const', поскольку вы предлагаете не работать. Это объект 'a', на который вы вызываете неконвертный элемент, вызывающий ошибку. – Persixty

ответ

11

Вы можете перегрузить метод «ЕОКП», как это:

C& getC() { return c; } 
const C& getC() const { return c; } 
+0

Я не думаю, что есть необходимость в перегрузке, только вторая форма функции будет достаточной. – Codi

+0

Перегрузка работает. Почему я не подумал об этом ...Мне нужны обе формы, так как иногда я хочу изменить содержимое C. Спасибо. –

0

Если вы вызываете функцию const A&, то вам необходимо объявить эту функцию как const, а также, потому что компилятор не знает, является ли объект из A изменится или нет, поэтому он не может проверить константную-ность параметра const A& a

struct C { 
    int x,y; 
}; 

class A { 
public: 
    C c;  
    const C& getC() const { return c; } 
}; 

class B { 
public: 
    void forwardInfo(const A& a) const { 
    const C& c = a.getC(); 
    daoObject.updateTableX(c.x,c.y); 
    } 
}; 

примечания линии в классе A const C& getC() const { return c; }

Используя const, мы сообщим компилятору, что A::getC() не будет изменять объект, на который он вызывается, и поэтому это будет работать.

Также вам необходимо изменить возвращаемый тип функции как const, как и то, что вам нужно.

Примечание: вы можете присвоить значение const переменной const, но не наоборот. const - это добавленное свойство, которое сообщает компилятору, что значение (или адрес refernce, который также находится в некотором смысле) не изменится.

 int foo1 = 5; 
const int foo2 = 10; 

     int& bar1 = foo1; // allowed 
const int& bar2 = foo1; // allowed 
     int& bar3 = foo2; // NOT allowed -> will give compile time error 
const int& bar4 = foo2; // allowed 
Смежные вопросы