2016-11-16 2 views
1

Я делаю C++ после времени, я объявил статическую переменную внутри класса как конфиденциальную, и насколько я знаю, что статические переменные не зависят от объектов и разделяются между объектами. Если я попытаюсь для печати статической переменной вне класса с использованием имени класса. Я получаю ошибки компиляции, потому что переменная является частной? Я прочитал, что к статическим переменным можно получить доступ только по имени класса и оператору разрешения области.Доступ к частной статической переменной за пределами класса

#include <iostream> 

using namespace std; 

class Sample{ 

    int val; 
    static int value; 
    public: 


     Sample(int in); 
     Sample(); 
     void setval(int in){ 

      val = in; 
     } 

     void printval()const{ 

      cout << val<<endl; 
     } 

}; 

Sample::Sample(int in){ 

    val = in; 
} 

Sample::Sample(){ 

    val = 0; 
} 

int Sample::value = 34; 
int main() 
{ 

    const Sample obj(1); 
    Sample obj2; 

    obj2.printval(); 

    obj.printval(); 

    cout <<"static value = " << Sample::value; 

    return 0; 
} 

Ошибка

main.cpp:37:5: error: 'int Sample::value' is private                                     
int Sample::value = 34;                                            
    ^                                                
main.cpp:49:39: error: within this context                                        
    cout <<"static value = " << Sample::value; 
+2

'это потому, что переменная private' да, и сообщение об ошибке говорит вам именно это. Тот факт, что переменная является статичной, не изменяет того факта, что она по-прежнему является частной. – SingerOfTheFall

+1

Если вы не хотите, чтобы переменная была 'private', почему вы объявили ее« приватной »? –

+2

Это то, что частные средства - это не допускается использовать его вне класса. См. Http://stackoverflow.com/questions/860339/difference-between-private-public-and-protected-inheritance – woockashek

ответ

2

, насколько я знаю, статические переменные являются независимыми объектами и общими для всех объектов

Это правильно. Однако обмен переменных между экземплярами объектов и доступность переменных не зависит друг от друга. Существует четыре комбинации (общих, доступных) пар. Все четыре доступны:

  • public static переменные является общим и доступны за пределами класса
  • private static переменным является общим, но не доступен за пределами класса
  • public нестатические переменный не используется совместно, но доступна вне класса
  • private нестатическая переменная не является ни общим, ни доступны за пределами класса

Обратите внимание, что путь вы имеете дело с частным статическим value может быть смоделирован после того, как вы работаете с нестатической val, т.е. предоставляя своим пользователям класса публичные члены-функции для работы со статической переменной:

class Sample { 
... 
public: 
    static int getvalue() { return value; } 
}; 

Теперь вы можете распечатать его, как это:

cout << "static value = " << Sample::getvalue(); 
+0

Используется существующий метод printval() для распечатки статической переменной. –

+0

@ SanthoshPai Это тоже работает. Нестатические функции-члены могут обращаться к статическим переменным-членам вместе с нестационарными переменными-членами. – dasblinkenlight

1

Частные члены класса и методы доступны только члены и методы класса. Это верно, является ли элемент класса статическим или нет. Это не влияет на доступность члена класса.

Обратите внимание, что метод открытого класса имеет доступ к частным членам класса, как и любой другой метод, и это не исключает возврата метода открытого класса из указателя или ссылки на частные члены класса. Это один из вариантов для вас.

Смежные вопросы