Форум программистов, компьютерный форум CyberForum.ru

Обращение к private параметрам класса в main - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Jack Wade
61 / 34 / 6
Регистрация: 24.02.2013
Сообщений: 250
10.09.2013, 12:12     Обращение к private параметрам класса в main #1
Подскажите пожалуйста, как обращаться к private параметрам класса внутри функции main?
Вот, допустим, у меня есть некий класс: CClass1.
В нём в private есть следующие параметры:
int Par1; int Par2;
Однако, при попытке обратится к параметру Par1, выдаётся ошибка о том, что параметр недоступен.
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class CClass1
{
private:
int par1;
}
 
int main()
{
CClass1 MyClass1;
MyClass1.par1=100;//Для примера, я хочу присвоить значение параметра par1(приватный параметр) как 100, однако, этот параметр защищён...
 
return 0;
}
P.S. и подскажите пожалуйста, если не трудно... как мне сделать "частичное унаследование"(т.е. что бы был доступ лишь к части параметров)... допустим, есть класс CClass1, с параметрами public int a,b,c; и private int g,d,e;, однако, при наследовании новым классом CClass2, все параметры посылаются из CClass1 в CClass2, однако, мне не нужны там параметры g,d,e)...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kukurudza
104 / 85 / 6
Регистрация: 29.08.2012
Сообщений: 539
10.09.2013, 12:31     Обращение к private параметрам класса в main #2
учите матчасть. к приватным полям нельзя обращаться извне, на то они и приватные.
про а б ц д е ф приведите пример. что хотите сделать?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
10.09.2013, 12:34     Обращение к private параметрам класса в main #3
Цитата Сообщение от Jack Wade Посмотреть сообщение
при попытке обратится к параметру Par1, выдаётся ошибка о том, что параметр недоступен.
Секция private предназначена только для использования самим классом внутри себя. (ну и наследниками) Специально так задумано, чтобы нельзя было руками из вне там что-нибудь поправить.
Нужно создать public метод, который будет работать с этим членом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class CClass1
{
private:
int par1;
public:
int RetPar1(){return par1;}
void SetPar1(int par){par1 = par;}
}
 
int main()
{
CClass1 MyClass1;
MyClass1.SetPar1 = 100;
int i = MyClass1.RetPar1;
 
return 0;
}
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
10.09.2013, 12:36     Обращение к private параметрам класса в main #4
Цитата Сообщение от Jack Wade Посмотреть сообщение
Подскажите пожалуйста, как обращаться к private параметрам класса внутри функции main?
Вот, допустим, у меня есть некий класс: CClass1.
В нём в private есть следующие параметры:
int Par1; int Par2;
Однако, при попытке обратится к параметру Par1, выдаётся ошибка о том, что параметр недоступен.

P.S. и подскажите пожалуйста, если не трудно... как мне сделать "частичное унаследование"(т.е. что бы был доступ лишь к части параметров)... допустим, есть класс CClass1, с параметрами public int a,b,c; и private int g,d,e;, однако, при наследовании новым классом CClass2, все параметры посылаются из CClass1 в CClass2, однако, мне не нужны там параметры g,d,e)...
При наследовании весь класс входит в новый. Private остаётся private и к нему нету доступа из нового класса. Если все не надо, то надо подумать, надо ли наследование. Или поделить класс на более мелкие и наследовать не все.
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
10.09.2013, 12:37     Обращение к private параметрам класса в main #5
Члены и методы класса размещенные в секции private: доступны только методам данного класса.
Члены и методы класса размещенные в секции public: доступны всем.
Члены и метода класса размещенные в секции protected: доступны методам данного класса и всем наследникам класса.
Что бы члены и методы класса наследовались, их нужно объявлять с ключевым словом virtual.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.09.2013, 15:05     Обращение к private параметрам класса в main #6
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Секция private предназначена только для использования самим классом внутри себя. (ну и наследниками)
Наследникам не доступна. Для этого есть protected.
Цитата Сообщение от gomodril Посмотреть сообщение
Члены и методы класса размещенные в секции private: доступны только методам данного класса.
И друзьям. Так же для protected.
Цитата Сообщение от gomodril Посмотреть сообщение
Что бы члены и методы класса наследовались, их нужно объявлять с ключевым словом virtual.
virtual нужен совсем для другого.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
10.09.2013, 15:10     Обращение к private параметрам класса в main #7
А еще я бы рекомендовал разобраться с private/protected/public наследованием.

Это описано в Ст. 11.2
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
10.09.2013, 15:35     Обращение к private параметрам класса в main #8
Цитата Сообщение от Tulosba Посмотреть сообщение
virtual нужен совсем для другого.
Вот что нашел - virtual применяется в тех случаях, когда множественное наследование вместо предполагаемой полной композиции свойств классов-предков приводит к ограничению доступных наследуемых свойств вследствие неоднозначности. Базовый класс, наследуемый множественно, определяется виртуальным с помощью ключевого слова virtual.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.09.2013, 15:42     Обращение к private параметрам класса в main #9
gomodril, виртуальное наследование и виртуальные функции это не одно и то же
Jack Wade
61 / 34 / 6
Регистрация: 24.02.2013
Сообщений: 250
10.09.2013, 23:19  [ТС]     Обращение к private параметрам класса в main #10
Большое всем спасибо!
Я на самом деле, просто имел неправильное представление о классах... Пытался учить классы при помощи всевозможных сайтов-не помогло... Пытался изучить классы из учебника-не помогло(точнее, помогло лишь узнать, что class CCLass2:CClass1 - это наследование... А вот то, что такое private, что такое static...)...
Если что - книга "Т.А. Павлоская - С/C++ - Программирование на языке высокого уровня"(может быть, учебник и хороший... просто... Я лично использую такого рода учебники скорее, как справку, в случае, если что то забуду, или что бы быстренько что то изучить. А тут, получается, что я должен был всё с самого начала читать, дабы понять о чём речь... В общем-мне этот учебник, не подошёл...).
Кликните здесь для просмотра всего текста

Почему я взял этот учебник? У меня просто есть от этого же издательства книга о Delphi(да и по Turbo Pascal достаточно нормальная... А вот с С++, как то, не очень всё хорошо вышло... на мой взгляд...). И, она очень хорошая. Там вот именно, что она похожа скорее на справку, в которую можно обратится в случае каких то либо проблем... А здесь... Просто, мне нужна была книга, в которой было бы всё "коротко и по делу"... На изучение теории, всё таки, я бы так же, не посоветовал эту книгу по С++... Т.к. даже теорию было бы лучше изучать, открыв конкретную главу и сразу читать о тебе нужной теме, а не видеть отсылку на какую то определённую тему, которая отсылается на другую(я понимаю, знать нужно всё... но, неужели нельзя было в краце написать ту информацию, которая нужна была в данной теме?)...

Там с классами лично мне, не совсем понятно было...
Однако, вот, нашёл более-менее вменяемую информацию, и... Вот что я понял(может быть, что то неверно, но, опять же... как понял-так и написал)...
Надеюсь, что хотя бы часть будет верна, и, надеюсь, что, хотя бы кому то это понадобится:
Кликните здесь для просмотра всего текста

Сразу написал в комментарии о классах...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*
Что такое класс в С/С++?//Возможно-неверно... да и, скорее всего-неверно...
Класс-некая структура, состоящая из параметров(переменных) и методов(функций).
К примеру, вот нужно создать некий комплекс параметров(имя, рост, вес, пол, группа крови, и т.д.).
Однако, что бы не писать несколько структур, можно создать пару классов. Один класс-должен быть исходным.
Вот, если нам нужно будет сделать класс Человек и Собака, значит... Эти оба класса наследуют исходные параметры, плюс мы добавляем новые параметры к классу Собака(длина хвоста, цвет шерсти, и т.д.). А к классу Человек добавляем(цвет волос, цвет кожи и т.д.).
Так же, классы могут содержать методы(функции). Методы предназначены для каких то определённых операций, будь то с классовыми переменными, будь то с переменными из вне класса...
Методы так же, могут наследоваться, как и переменные, и доступ как к переменным, так и к функциям нужно прописывать отдельно.
 
Какие есть типы доступов параметров и методов в классах?
В классах есть следующие параметры доступа:
public - публичные параметры. Они могут быть вызваны из вне класса(из любого места...)
Нужен данный тип доступа для того, что бы можно было обращаться ко всем параметрам в любом месте...
static - статические параметры. Они могут быть вызваны только в классах(в исходном, и наследующем)
Такой тип доступа нужен для того, что бы параметр был доступен только лишь внутри класса.
Статические переменные объявляются могут так же, как и публичные переменные, которые наследуются другими классами, но их использовать можно только внутри класса(т.е. написать тупо CClass1.StaticX не получится...)
Статические параметры с публичным доступом(например) можно использовать только в классах и в функциях класса, но не как в других функциях, или даже в главном коде программы... Если в краце - как то так...
private - приватные параметры. Они могут быть вызваны только внутри исходного класса, и заносить данные в них можно только лишь  внутри функций класса... Короче говоря - это только родной класс, и ничего более...
Нужен данный тип доступа для того, что бы ограничить некоторые параметры от прямого изменения из вне.
Например - оценки... Что бы, когда будем создавать некую библиотеку классов, другой программист не смог просто так взять, и заменить значение параметра оценки... Для ограничения к доступу, так сказать...
 
Как идёт обращение к параметрам/функциям в public?
Параметры public можно использовать в абсолюте, где угодно. Это открытые параметры, которые могут быть вызваны из любой функции,    из любого цикла... в любой момент времени.
Делается это следующим образом:
имя_класса   переменная_класса.название_публичной_переменной
Например:
class CClass{ public: int x; }
CClass ExampleCClass;
ExampleCClass.x=10;//Таким образом, мы занесли в публичный параметр класса CClass значение 10
 
Как идёт обращение к параметрам/функциям в private?
Приватные параметры могут быть вызваны только внутри функций в классе, и только там, и нигде более.
Т.е. написав в main функции наращивание некой приватной переменной не получится, т.к. идёт вызов параметра вне класса.
Аналогично и с классами. В классе A2, который наследует параметры A1(у которого есть private параметр) не может использовать приватные параметры А1 Т.е. класс А2, не может иметь приватные параметры А1(так же, как и функции, которые используют такие параметры).
Обращаться лучше всего по средствам публичных функций, либо статических функций.
Например:
class CCLass{ private: int Result; /// /// public: void EnterResult(){std::cin>>Result;} }
//Теперь, как же внести значение в Result?
CClass ExampleClass;
ExampleClass.EnterResult();//Вызов функции ввода в Result
Не получится сделать:
class CCLass{ private: int Result; /// /// public: void EnterResult(){std::cin>>Result;} }
class ClError:CCLass{}
ClError ErrorClass;
ErrorClass.EnterResult();// - здесь компилятор выдаст ошибку о том, что функцию использовать нельзя, т.к. параметр,     требуемый для её работы, можно вызвать только внутри исходного класса
 
Как идёт обращение к параметрам в static?
Тип доступа static определяет лишь то, что данная переменная, либо функция должна использоватся только внутри самого класса, либо внутри класса-наследодателя. Т.е. что это значит?
Это значит, что теперь нельзя будет просто так взять, и объявить CClass1.StaticX=10. Теперь, нужно указывать, что StaticX-член класса.
Например:
сlass CClass{public: static int StaticX;}//Данный класс содержит одну публичную переменную, доступ к которой возможен только лишь при условии указания класса
class CClass2:CClass{public: void EnterStaticX(){std::cin>>CClass2::StaticX;} };//К примеру, у нас есть второй класс, который наследует параметры первого класса    
//И у данного класса есть лишь один публичный метод(публичная функция) - ввод в статический параметр StaticX. 
//Т.к. второй класс полностью наследовал все параметры из первого класса, то доступ к данной переменной осуществляется 
именно таким образом(если через функцию, хотя, по другому то, и нельзя...)  Можно конечно объявить значение статического 
параметра во вне кода(т.е. это примерно так: int Cclass2::StaticX=10; Здесь мы присвоили публично-статическому параметру значение 10)...
Не получится сделать:
сlass CClass{public: static int StaticX;};//Объявление нашего класса
int main()//Главная функция программы(главный код, если грубо сказать...)
{
CClass ErrorClass;//Переменная нашего класса)
ErrorClass::StaticX=10;//Здесь компилятор выдаст ошибку, суть которой заключается в том, что параметр StaticX
//используется во вне класса(он используется в главном коде, а это, сторонняя функция,
//значит-вне класса...
return 0;
}
*/
 
#include "stdafx.h"//Подключение библиотеки с стандартными пред-установками(подключением) модулей. 
//Добавляется в Microsoft Visual Studio 2012
#include <iostream>//Подключение библиотеки input-output stream
#include <Windows.h>//Подключение библиотеки системных команд Windows
 
 
 
//using namespace std;
 
 
 
//Мой класс 1(основной класс)
class MyClass1
{//Начало класса
int a1;//Данный параметр можно использовать только внутри класса MyClass1
public://Параметры, с доступом public будут доступны везде, и обращаться к ним можно из любого места
//Т.е. это полный доступ всех параметров, указанных в public
int b1;//Данный параметр будет доступен как исходному классу, так и наследуемому классу
private://Параметры, с доступом private можно использовать только лишь внутри самого класса
//Для примера, нужно запретить другим классам влиять на данную переменную, или даже, запретить конечному пользователю использовать эти параметры.
//Для этих целей(и не только) используются параметры в private
int c1;//Данный параметр будет возможно использовать только лишь внутри данного класса, и не использовать, как публичные переменные
//Т.е. например, нужно ограничить какую то переменную от пользователя.
public://Данные функции будут так же, доступны и в наследуемом классе(т.е. в классе, который будет наследовать параметры MyClass1)
void Enterc1()//Данная функция вводит в приватную переменную c1 данные из консольного ввода(standart::console_input)
{//Начало функции
std::cin>>b1;//Ввод данных в приватную переменную b1
}//Конец функции
void Seec1()//Данная функция отображает содержимое переменной c1
{//Начало функции
std::cout<<b1;
}//Конец функции
};//Конец класса
 
 
 
//Мой класс 2(дополнительный класс, который наследует параметры класса MyClass1)
class MyClass2:MyClass1
{//Начало класса
public://Объявление публичных параметров
int z1;//Публичная целочисленная переменная
};//Конец класса
 
 
 
 
//Объявление переменных наших классов
MyClass1 Test1;// Переменная MyClass1
MyClass2 Test2;// Переменная MyClass2
 
 
 
 
//Класс для примера использования статических переменных(параметров с статическим доступом)
class StaticExample
{//Начало класса
public:
static int StaticX;//Статическая переменная в классе StaticExample
//Т.е. данная переменная является статической, и не может быть использована простым методов, однако, её можно спокойно вызвать и из класса
//Т.е. например, нужно вывести значение этой переменной на экран. Значит, пишется далее следующий код:
//std::cout<<StaticExample::StaticX; - отображение значения StaticX(static) на экране
};//Конец класса
 
int StaticExample::StaticX=100;//Таким образом, можно занести данные в статические переменные
 
 
 
//Данный класс наследует статические параметры из класса StaticExample
class MyClass3:StaticExample
{//Начало класса
public://Объявление публичных параметров
void EnterStaticX()//Публичная функция ввода данных в статически-публичный параметр
{//Начало функции
//std::cin>>StaticX; - так делать нельзя, т.к. static, ровно так же, как и private может использована лишь внутри своего класса
std::cin>>MyClass3::StaticX;//Вот так, можно использовать статические переменные внутри даже наследуемого класса
}//Конец функции
void SeeStaticX()
{//Начало функции
std::cout<<MyClass3::StaticX;//Идёт вывод значения статически-публичного параметра на экран
}//Конец функции
};//Конец класса
 
MyClass3 Test3;//Переменная нашего 3-го класса, который наследует статические параметры у отдельного класса
 
 
//Главная функция(главный код программы)
int _tmain(int argc, _TCHAR* argv[])
{//Начало программы
setlocale(LC_ALL,"Russian");
std::cout<<"Введите значение переменной (private)c1 из класса MyClass1"<<std::endl;
Test1.Enterc1();//Вызов функции ввода данных в приватную переменную b1 класса MyClass1
system("cls");//Запуск системной команды очистки экрана консоли
 
std::cout<<"Значение переменной (private)c1 равно:"<<std::endl;
Test1.Seec1();//Вызов функции отображения содержимого приватной переменной b1 из класса MyClass1
std::cout<<std::endl;//Отображение перехода на след. строку(или просто, переход на след. строку)
system("pause");//Системная команда паузы
//Test2.Enterc1(); - в классе MyClass2 вызвать ввод в приватную для MyClass1 переменную не получится, т.к. не смотря на то, 
//что функция ввода в с1-публичная, используемая переменная с1-приватная. Значит-функция не доступна для сторонних классов
system("cls");//Запуск системной команды очистки экрана консоли
 
std::cout<<"Значение переменной (private)b1 класса MyClass1 (определена в коде)=";
Test1.b1=100;//Попытка присвоить публичную переменную b1 как 100(т.е. b1 равна 100)
std::cout<<Test1.b1<<std::endl;//Вывод на экран содержимого переменной b1
system("pause");//Системная команда паузы
system("cls");//Запуск системной команды очистки экрана консоли
std::cout<<"Введите значение переменной(static int StaticX) класса MyClass3: = ";
Test3.EnterStaticX();//Запуск функции из класса MyClass3 для ввода данных в статическую переменную StaticX
system("cls");//Запуск системной команды очистки экрана консоли
std::cout<<"Значение переменной (static int StaticX) из класса MyClass3 = ";
Test3.SeeStaticX();//Запуск функции из MyClass3 для отображения статической переменной(значения переменной) на экране
std::cout<<std::endl;//Отображение перехода на след. строку(или просто, переход на след. строку)
system("pause");//Системная команда паузы
system("cls");//Запуск системной команды очистки экрана консоли
//Test3.StaticX; - так тоже, обращаться к статическому параметру нельзя...
//std::cout<<Test3::StaticX; - и так нельзя обращаться к статическому параметру... Почему? Потому что параметр вызывается во 
//вне класса. Функция main не принадлежит ни одному из классов, которые имеют доступ к данной переменной. 
//А это значит-статическая переменная используется во вне класса...
 
return 0;//Возвращение 0(ноль), как результата работы функции
//Как и любая функция - главная функция должна возвращать результат...
}//Конец программы

P.S. изучал на отдельных примерах, и теорию читал для каждого типа доступа на отдельных сайтах... Что понял(и как понял) - то и написал в комментариях...

Добавлено через 1 час 54 минуты
Кликните здесь для просмотра всего текста

Конкретно о моей претензии к изучению классов по книге "Т.А. Павлоская - С/C++ - Программирование на языке высокого уровня":
Кликните здесь для просмотра всего текста

Пример... Я там не заметил примера использования Public, Static, Private...
Более того... Там пример какой то... не слишком "удачный"... Как то всё, разбросано что ли...
Обычно, в нормальных книгах, дают примеры по мере увеличения их сложности для понимания. Здесь же... Один пример на всю тему...
Нужно было, на мой взгляд, дать несколько примеров...
C++
1
2
3
4
5
6
7
8
9
10
class CClass1{ public: int x; };//В нашем классе CClass1 есть одна общедоступная переменная x
class CClass2:CClass1{ public: int y; };//Новый класс CClass2 наследует все параметры от CClass1(в нём так же, содержатся все переменные и функции(в данном случае, переменная целочисленного типа х))
//ну, примерно такого хотелось бы...
//а вот, что даётся там:
class monstr{ int health, ammo; public: monstr(int he=100, int am=10)+health=he; ammo=am;}//Как бы, понятно, что функция monstr заменяет параметры внутриклассовые health и ammo на то, что было получено из he и из am. Однако... почему было при равнение именно в объявлении параметров? Разве там не нужно перечислять те переменные, которые нужно оптравить функции для работы и с которыми она будет работать? Разве не легче тогда было просто написать след. функцию = void monstr(){health=100; ammo=10;}?
void draw(int x, int y, int scale);//Здесь, как я понял, будет объявлено действие функции позже... Но... почему тут нету примера, как это делается? Зачем мы посылаем туда параметры, что эта функция делает конкретно?
int get_health(){return health};//Как бы понятно, что функция возвращает значение health в переменную, в которой была использована данная функция... но, было бы, гораздо лучше описать ещё и функцию ввода в health...
//Просто... health-не публичный параметр, и, может возникнуть вопрос, на подобии "пишу monst.health=100, и компилятор сообщает об ошибке"...
int get_ammo(){return ammo;};//аналогично и get_health
}
Не кажется ли вам, что пример какой то слишком "не дружелюбный"? Конечно, когда уже хоть немного знаешь классы-пример хотя бы читабелен... Но, на мой взгляд-пример неудачен для новичков...
А по поводу private и т.д. ... Я их заметил только в конструкторах, и опять же... Пример там...
По моему-тему наследования нужно было поднять раньше... Однако, как такового, конкретного пояснения, зачем pribate, зачем public я так и не нашёл так...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2013, 19:28     Обращение к private параметрам класса в main
Еще ссылки по теме:

C++ Наследование классов и обращение к Private/Static
Обращение к методам класса через указатель на экземпляр класса C++
C++ Private и public члены класса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Casper-SC
 Аватар для Casper-SC
3465 / 1684 / 173
Регистрация: 27.03.2010
Сообщений: 4,824
Записей в блоге: 1
21.12.2013, 19:28     Обращение к private параметрам класса в main #11
Цитата Сообщение от gomodril Посмотреть сообщение
Что бы члены и методы класса наследовались, их нужно объявлять с ключевым словом virtual.
Это чтобы можно было переопределять метод.

Добавлено через 2 минуты
Сначала одно из:
Герберт Шилдт. Полный справочник по C#.
Эндрю Троелсен - Язык Программирования C# 5.0 и платформа .NET 4.5 (6-е издание, 2013).

Потом желательно:
CLR via C# - Программирование на платформе Microsoft.NET Framework 4.5 на языке C#. 4-е издание.

Добавлено через 3 минуты
Ой, народ, я не знаю как вообще попал в этот раздел, вроде клацал темы в C# разделе. Вы вообще о С++ общаетесь оказывается .
Yandex
Объявления
21.12.2013, 19:28     Обращение к private параметрам класса в main
Ответ Создать тему
Опции темы

Текущее время: 05:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru