Доступ к частным пользователям - PullRequest
1 голос
/ 12 сентября 2011

У меня есть класс:

class A
{
private:
ComplexClass member1;

public:
getMember1(){return member1;};
};

, и у меня есть реализация, которая для упрощения кода (более легко понятного) должна получить этот член1 для работы с ним.Первое, что пришло бы мне в голову, было бы:

ComplexClass *myComplexClass = &getMember1();

myComplexClass.getSomething();
myComplexClass.getSomethingElse();
etc.

, что, очевидно, неверно, так как я получаю указатель из нового объекта, а не из member1 (и получает предупреждение компилятора).

Мой вопрос: какой дизайн лучше всего подходит для подобных вещей?Как сохранить инкапсуляцию и одновременно облегчить доступ членов, используя указатель на нее?(Я хочу только читать с member1, а не писать на нем).

Должен ли я сделать

ComplexClass *getPointerToMember1()

внутри класса A?

Ответы [ 2 ]

3 голосов
/ 12 сентября 2011

Ссылка на const не позволит редактировать их. На мой взгляд, это делает ваше намерение более понятным, чем указатель на константу.

class A
{
private:
ComplexClass member1;

public:
const ComplexClass &getMember1(){return member1;};
};
1 голос
/ 12 сентября 2011

Вы возвращаете элемент по значению, которое составляет копию элемента ComplexClass.Таким образом, вы не работаете с реальным членом, когда вызываете последующие методы (и то, что говорит вам компилятор).

Я думаю, что более идиоматический подход C ++, который помогает поддерживать инкапсуляцию и уменьшает связь, заключается в созданиичлен алгоритма:

A::doStuff()
{
    member1.getSomething();
    member1.getSomethignElse();
}

Таким образом, любой, кто использует class A, не заботится , что реализация использует ComplexClass, но вместо этого просто знает, что он может сказать Aсделайте некоторую работу, и это будет сделано наилучшим образом.

РЕДАКТИРОВАТЬ для комментария: В этом случае я бы предложил создать в A методы, которые получают значения из ComplexClass (снова, чтобы скрыть ваширеализация).Если это не подходит, вы можете вернуть реализацию по константной ссылке: const ComplexClass& getMember1() const { return member1; }

...