Capisco che un vantaggio di avere funzioni membro statiche non è dover inizializzare una classe per usarle. Mi sembra che un altro vantaggio potrebbe non avere accesso diretto alle cose non statiche della classe.Utilizzo della parola chiave "statica" per limitare l'accesso nelle funzioni membro C++
Ad esempio, una pratica comune è se si sa che una funzione avrà argomenti che non sono di essere cambiato, semplicemente marcare questi costante. ad esempio
bool My_Class::do_stuff(const int not_to_be_changed_1,
std::vector<int> const * const not_to_be_changed_2)
{
//I can't change my int var, my vector pointer, or the ints inside it.
}
Quindi è valido utilizzare le funzioni membro statiche per limitare l'accesso. Ad esempio, supponiamo di avere una funzione
void My_Class::print_error(const unsigned int error_no) {
switch (error_no) {
case 1:
std::cout << "Bad read on..." << std::endl;
break;
//...
default:
break;
}
}
Beh, qui non stiamo andando ad essere l'accesso a tutte le variabili membro della classe. Quindi, se ho cambiato la funzione di:
static void My_Class::print_error(const unsigned int error_no) {
switch (error_no) {
case 1:
std::cout << "Bad read on..." << std::endl;
break;
//...
default:
break;
}
}
mi piacerebbe ora ottengo un errore, se ho inavvertitamente provato ad accedere a uno dei miei private var, ecc (a meno che non mi passa me stesso un'istanza della mia classe, che avrebbe essere propositivo^_ ^!)
si tratta di una tecnica valida, simile a fare in modo proattivo args che non devono essere modificate le costanti?
Quali svantaggi potrebbero avere in termini di efficienza o utilizzo?
Il motivo principale per cui mi chiedo è che la maggior parte dei tutorial "statici" che ho letto non ha menzionato l'utilizzo in questo modo, quindi mi chiedevo se ci fosse un buon motivo per non farlo, considerando che sembra un utile strumento.
Edit 1: Una giustificazione ulteriore logica di questo uso:
Ho una funzione print_error come sopra. Potrei usare uno spazio dei nomi:
namespace MY_SPACE {
static void print_error(...) {
...
}
class My_Class {
....
void a(void)
}
}
ma questo è un dolore, perché ora ho di allungare tutti i miei dichiarazioni var, cioè
MY_SPACE::My_Class class_1;
tutto per rimuovere una funzione della mia classe, che in sostanza è un membro della mia classe.
Naturalmente c'è più livelli di controllo di accesso per le funzioni:
//can't change pointer to list directly
void My_Class::print_error(std::vector<int> const * error_code_list) {...}
//can't change pointer to list or list members directly
void My_Class::print_error(std::vector<int> const * const error_code_list) {...}
//can't change pointer to list or list members directly, access
//non-const member vars/functions
void My_Class::print_error(std::vector<int> const * const error_code_list) const {...}
//can't change pointer to list or list members directly, access
//non-static member vars/functions
static void My_Class::print_error(std::vector<int> const * const error_code_list) {...}
//can't change pointer to list or list members directly, access
//member vars/functions that are not BOTH static and const
static void My_Class::print_error(std::vector<int> const * const error_code_list) const {...}
sicuro che questo è un po 'atipico, ma per diminuire gradi in modo stanno utilizzando le funzioni e le variabili const const. Ho visto molti esempi in cui le persone avrebbero potuto usare una funzione const, ma non l'hanno fatto. Eppure alcune persone pensano che sia una buona idea. Conosco molti programmatori C++ che non capiscono le implicazioni di una funzione const o di una statica. Allo stesso modo molto capirebbe entrambi.
Quindi, perché alcune persone sono così categoricamente contrarie all'uso di questo come un meccanismo di controllo dell'accesso se la lingua/specifiche lo prevede di essere utilizzato come tale, proprio come fa con le funzioni const, ecc.?
Sembra strano avere una funzione come membro di una classe se hai intenzione di negare i diritti di accesso ai membri. – JoshD
Un modo migliore per limitare l'accesso sarebbe semplicemente utilizzare una funzione non membro. Non capisco davvero cosa stai cercando di proteggere contro, però. –
Supponiamo che tu abbia una funzione membro che NON SA necessario per accedere alle variabili/funzioni membro al momento, ma è correlata al lavoro/funzione della classe. Concettualmente la sua inclusione nella classe ha senso, ma vuoi assicurarti che non ci sia accesso ai membri della classe. Quindi potresti renderlo una funzione statica, proprio come faresti con una variabile che vuoi impedire l'accesso a una variabile 'const'. Certo, potresti semplicemente non toccare la variabile/membri, e quindi non usare 'const' /' static', ma molti scelgono di sbagliare sul lato della cautela, almeno nel loro uso di 'const'. –