C ++ члены данных. Цель: Инициализировать в конструкторе, затем оставить в покое, сработает ли здесь const? - PullRequest
0 голосов
/ 28 августа 2011

У меня есть следующее

    struct dweDMPair {
        const dweller   *occu;
        const double    sqDM;
        float   prob;
        dweDMPair(dweller *inOccu, double sqdm) : occu(inOccu), sqDM(sqdm) {}       };

Я хочу вернуть массив указателей на эти объекты, но хочу, чтобы они не были случайно удалены клиентом.Или, может быть, нет, просто попробуйте эту итерацию проекта.

Мой вопрос заключается в том, существует ли (очень лаконичный и аккуратный) способ указания (как я проиллюстрировал с префиксом const), что члены являются тольконазначен в конструкторе?

Я знаю, что private / public и интерфейс / методы могут это отсортировать, но, к сожалению, как далеко можно использовать ключевое слово const?

_ РЕДАКТИРОВАТЬ _

Наваз, моя цель - просто инициализировать 2 из 3 элементов данных только один раз, в конструкторе.Затем я могу экспортировать этот экземпляр как const dweDMPair * ptrToVal, чтобы клиент не мог затем вызвать delete - потому что это не сработает с указателями на экземпляры const, не так ли?Затем клиент продолжит указывать свое значение для третьего члена prob.да, я знаю, что функции обеспечивают защиту, но я хочу ее быстрее.

Члены не могут быть статичными, но могут быть членами экземпляра.Если вам интересно ...

Ответы [ 2 ]

2 голосов
/ 28 августа 2011

Да, const делает то, что вы хотите.Обратите внимание, что то, что вы делаете в списке инициализатора конструктора, это не присваивание, это инициализация.Вы не можете назначать константные объекты, но вы можете инициализировать их значением.Кроме того, независимо от того, чтобы они были константными, вы можете рассмотреть возможность инкапсуляции этих членов в классе как частных.Это не намного больше печатает, но улучшает удобство обслуживания.

Редактировать:

Чтобы определить константный указатель, вы делаете:

Type * const member;

не

const Type* member;

второй синтаксис - указатель на константный тип, а не константный указатель.

1 голос
/ 29 августа 2011

Вы уточняете, что вы действительно хотите:

Затем я могу экспортировать этот экземпляр как const dweDMPair * ptrToVal, чтобы клиент не мог затем вызвать delete - потому что это не будет работать с указателямик const экземплярам это будет?

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

Пример кода, который компилируется без жалоб:

struct dweller {
};

 struct dweDMPair {
        const dweller   *occu;
        const double    sqDM;
        float   prob;
        dweDMPair(dweller *inOccu, double sqdm) : occu(inOccu), sqDM(sqdm) {}       
 };

int main() {

    dweDMPair const* p = new dweDMPair(NULL, 3.14);

    delete p;
}

Возможно, вы захотите уточнить вашу конечную цель (возможно, вдругой вопрос, если это изменит это слишком).

...