Если вы верните указатель или не const-ссылку на свой личный член данных через общедоступный метод, бессмысленно сделать его приватным. Вы также можете сделать недвижимость публичной.
В основном это означает, что вы позволяете манипулировать членом вне класса. ИМО это считается плохой практикой, или даже анти-шаблон, потому что класс не может зависеть от своего собственного состояния. Это очень важно.
E.g: Представьте, что у вас есть указатель, и кто-то устанавливает его на null
. Даже частные методы должны были бы проверить его, даже если внутренне такое состояние невозможно достичь.
Возвращающиеся нормальные члены, такие как классы считается плохой практикой , потому что она включает в себя копирование целых объектов. Обычно лучше возвращать ссылку или, вероятно, предпочтительно константу ссылки.
Получатели, в свою очередь, позволят вам установить ограничения const
. В обоих случаях указатели и ссылки.
Также обратите внимание, что в таких случаях обычно предусмотрено два метода. compute
и get
. В настоящее время вы можете получить доступ к своему члену, только вычислив его!
Я не зашел так далеко, чтобы предложить вам перейти на std::vector
, так как я не знаю, что вам нужно, и векторы не хороши для всего. Так наклеивание с указателями, это безопасный путь:
class A
{
private:
double **CR;
public:
double const * const * compute2D();
double const * const * getCR();
};
double const * const * A::compute2D(){
return CR;
}
double const * const * A::compute2D(){
/*Heave CPU stuff*/
return CR;
}
int main(){
A a;
double const* const* tmp = a.compute2D();
tmp[1][2] = 0; //this will fail to compile
tmp[1] = 0; //this will fail too
double get_test = tmp[1][2]; // this passes!
}
Примечания двойных const
классификаторов. Важно защитить каждый уровень ссылок указателей.
«Я правильно использую сборщик мусора?» - Нет, поскольку нет сборщика мусора. Вы, кажется, правильно удаляете выделенную память, но если вы хотите обходиться с помощью 'new' и' delete', вам нужно будет реализовать или предотвратить копирование в [«Правило трех»] (http: // stackoverflow .com/вопросы/4172722). Еще лучше используйте класс RAII, например 'std :: vector', чтобы управлять памятью для вас (в соответствии с« Правилом нуля »). –
, вы можете захотеть вернуть указатель const, чтобы предотвратить другие классы, изменив частный член. Это можно обойти, используя reinterpret_cast, но это, как правило, также будет считаться плохим стилем. – Laurijssen