Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование: создается один большой класс? методы и this 
:(
    Опции темы
Gunslinger
Дата 15.1.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(mes @  15.1.2010,  15:28 Найти цитируемый пост)
ну так запустите и проверьте..

Хм, не видит char(). Выводит int.

Цитата(mes @  15.1.2010,  15:28 Найти цитируемый пост)
ключевое слово this и указывает на адрес полученного объекта.

Уточнение: полученный объект == копия данных класса? (Раньше объект воспринимал монолитно: объект - это и данные, и методы(когда не знал, что методы существуют в одном экземпляре))

Цитата(mes @  15.1.2010,  15:28 Найти цитируемый пост)
статические объявляются в классе, но  должны быть определены вне класса

Код

class A{
      static int n1;
}

class B: public A{
 public: 
      B(int f){
             A::n1=f;}
}

B obj1(12);
//либо
А.n1=12;

Это?


Это сообщение отредактировал(а) Gunslinger - 15.1.2010, 17:29
PM MAIL   Вверх
mes
Дата 15.1.2010, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  15.1.2010,  15:49 Найти цитируемый пост)
Хм, не видит char(). Выводит int.

не чар не видит.. когда нет абсолютно подходящей функции, тогда происходит неявное преобразование параметров.
но это как правильно заметил baldina будет лишним..  оставим разбор на будущее..

Цитата(Gunslinger @  15.1.2010,  15:49 Найти цитируемый пост)
полученный объект == копия данных класса? 

зависит от способа передачи:
  если по значению то копия
  если по имени/ссылке то оригинал



Цитата(Gunslinger @  15.1.2010,  15:49 Найти цитируемый пост)
объект - это и данные 


уточнение объект (инстанция класса)  это совокупность всех не статических  данных-членов  как самого класса, так и всех его подклассов 
(и некой служебной информации в случае обладания виртуальными функциями)

Цитата(Gunslinger @  15.1.2010,  15:49 Найти цитируемый пост)
когда не знал, что методы существуют в одном экземпляре)

это про статические данные корректно говорить что они существуют в единственном экземпляре.
а когда такое про функции  - то слух режет. Дело в том смысле какой Вы вкладываете.
Не важно в вашем вопросе сколько экземпляров метода существует.  А в том что функции не принадлежат обьекту, а оперируют им. 
Код

A1 obj; obj.f();

мы вызвали НЕ функцию f объекта obj,
а вызвали функцию f класса A и передали ей объект obj как параметр.
( то что получит функция зависит от способа передачи.. то есть прежде чем стать аргументом this может произойти как  простое копирование (при передаче по значению), так и преобразование типа .. но это опять другая тема)








Это сообщение отредактировал(а) mes - 15.1.2010, 20:00


--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 15.1.2010, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(mes @  15.1.2010,  19:59 Найти цитируемый пост)
мы вызвали НЕ функцию f объекта obj,
а вызвали функцию f класса A и передали ей объект obj как параметр.

Это я понимаю.

Цитата(mes @  15.1.2010,  19:59 Найти цитируемый пост)
это про статические данные корректно говорить что они существуют в единственном экземпляре.
а когда такое про функции  - то слух режет. Дело в том смысле какой Вы вкладываете.

Просто хотел подчеркнуть, что:
Код

class A{
  int data1;
  int data2;
 public:
    int a1(){};
    int a2(){};
}

A obj1;
A obj2;
.........
A objn;    
 
Компилятор создает:
Код

namespace A{
   int a1(){};
   int a2(){};
}

struct obj1{
int data1;
int data2;
}

struct obj2{
int data1;
int data2;
}

.....



Это сообщение отредактировал(а) Gunslinger - 15.1.2010, 21:46
PM MAIL   Вверх
mes
Дата 15.1.2010, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  15.1.2010,  20:45 Найти цитируемый пост)
Просто хотел подчеркнуть, что:

у Вас либо куча опечаток в коде, либо Вы все таки не до конца поняли...



--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 16.1.2010, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(mes @  15.1.2010,  22:08 Найти цитируемый пост)
у Вас либо куча опечаток в коде, либо Вы все таки не до конца поняли...

Значит не до конца... Что в коде не верно представляю?
PM MAIL   Вверх
mes
Дата 16.1.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



ну прежде всего в первом коде идет создание N объектов, а во 2м описание N структур объектов.
ну и мелочь : аналог метода описанный в  namespace должен принимать (скрытый) параметр на объект.
Вот  расширенный пример того что Вы писали:
Код

class A 
{
      char c;
   public:
    A () {c = 'A'; }
     void  f () { std::cout<< c; }
};
class B 
{
      char c;
   public:
     B() { c= 'B'; }
     void  f () { std::cout<< c; }
};
int main () {
A  a;
B  b;

a. f();
b.f();
b.A::f();
}


может быть представлен  в таком условном  коде :
/* примечания :
 в квадратных скобках указываются скрытые параметры (при чтение кода не учитывать так как не являются разделительными)
 со знаком $  обозначены внутренние действия компилятора
 указание прав доступа не учитывается..
 код не отнсящийся на прямую к примеру (std::cout) представлен без изменений
*/

Код


struct A [::this_t] {
  char [A::] c;   
};

struct B [::this_t] {
  char [A::] c;
  char [B::] c;
};

// дoбавляем компил-тайм правило для компилятора о возможности преобразования по наследию :
$cast_rule: B --> A = true

void [A::] f ( [A::this_t* this] ) { std::cout << this->[A::]c; }
void [B::] f ( [B::this_t* this] ) { std::cout << this->[B::]c; }

int main () {

 A [::this_t]  a;
 B [::this_t]  b;

 [A::] f ( [&a] );
 [B::] f ( [&b] );
 [A::] f ( [&b] );
}
   

надеюсь пример не запутает Вас eще сильней..
старался сделать как можно понятнее..
smile

Это сообщение отредактировал(а) mes - 19.1.2010, 20:08


--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 18.1.2010, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(mes @  16.1.2010,  14:38 Найти цитируемый пост)
$cast_rule: B --> A = true

В верхнем коде класс В не наследует от А. Вы забыли дописать или все верно?
PM MAIL   Вверх
mes
Дата 18.1.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  18.1.2010,  09:07 Найти цитируемый пост)
В верхнем коде класс В не наследует от А. Вы забыли дописать или все верно? 

Вы ж не думаете, что принятая форма записи в С++ - единственная возможная ?
часть B повторяет структуру А ? есть правило приведения от наследника к базовому ? Ну значит условно наследуется.  ;)
Я специально выбрал вариант, чтоб на разнице показать что есть наследование по сути.
smile

А вообще компилятор прежде, чем компилить в объектный файл, приводит текст программы в удобное для него состояние.
Rаньше С++ компилятор был вообще простым С-кодогенератором. Т.е. из С++ программы генерил С-код (в котором как известно нет инструмента наследования).
Ну так будем считать, что приведенный пример одна из стадий (препроцессор) такого кодогенератора, которая разворачивает код связанный с наследованием в условный с-структурный вид.
smile

Это сообщение отредактировал(а) mes - 18.1.2010, 11:28


--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 18.1.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(mes @  18.1.2010,  11:12 Найти цитируемый пост)
Вы ж не думаете, что принятая форма записи в С++ - единственная возможная ?

Кроме с++ной записи о других не знаю. Т.е. вы описали то же наследование? А то у меня чуть крыша не поехалаsmile А так почти все понятно --  ваш высокоуровневый код с namespace, но уже в низкоуровневом исполнении. Вот эта строка только не дается:
Код

[A::] f ( [static_cast<A*>(&b)] );


Код

struct B [::this_t] {
  char [A::] c;
  char [B::] c;
};

  char [A::] c; -- это вроде ссылки или указателя на структуру А?
  Как происходит подобное приведение: определяется, где в структуре В находится А::с? 


PM MAIL   Вверх
mes
Дата 18.1.2010, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  18.1.2010,  15:21 Найти цитируемый пост)
Т.е. вы описали то же наследование?

Будет точнее сказать что я раскрыл классы с наследованием на простые структуры с той же зависимостью.

Цитата(Gunslinger @  18.1.2010,  15:21 Найти цитируемый пост)
Как происходит подобное приведение: определяется, где в структуре В находится А::с? 

нет.. Зачем определяться если структура наследник, содержит все данные предка в той же последовательности с нулевым (в нашем случае) смещением.



--------------------
PM MAIL WWW   Вверх
mes
Дата 18.1.2010, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  18.1.2010,  15:21 Найти цитируемый пост)
Вот эта строка только не дается:

static_cast - это безопасное приведение. Для того чтоб наш наследник мог конвертиться
мы установили 
Цитата(mes @  16.1.2010,  13:38 Найти цитируемый пост)
$cast_rule: B --> A = true

хотя на самом деле лучше подошла бы функция-конвертер, но это опять уже  несколько другая тема..

smile


--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 19.1.2010, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Код

[A::] f ( [static_cast<A*>(&b)] );

Благодаря скрытому параметру this каждый метод определяет, где находятся данные, с которыми он будет работать.. 
Тогда такое приведение значит, что this B меняется на this, где расположена struct A?

Это сообщение отредактировал(а) Gunslinger - 19.1.2010, 12:50
PM MAIL   Вверх
mes
Дата 19.1.2010, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  19.1.2010,  11:48 Найти цитируемый пост)
Тогда такое приведение значит, что this B меняется на this, где расположена struct A?

убрал я из примера static_cast -  для сути он не нужен.

имя "A::f" логически идеентично "A_f", а "::" просто специфичный разделитель, позволяющий программисту записывать имена в неполной форме.
(до полной дорабатывает компилятор)

Хотя приведенное еще не полное имя функции, а специализированное.. - т.е. в имя включена зона в которой его определили.
полное включает в себя еще типы параметров, благодаря чему и становится возможна перегрузка.




--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 20.2.2010, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(mes @  19.1.2010,  20:14 Найти цитируемый пост)

имя "A::f" логически идеентично "A_f", а "::" просто специфичный разделитель, позволяющий программисту записывать имена в неполной форме.
(до полной дорабатывает компилятор)

Хотя приведенное еще не полное имя функции, а специализированное.. - т.е. в имя включена зона в которой его определили.
полное включает в себя еще типы параметров, благодаря чему и становится возможна перегрузка.

Например, из кода
Код

struct A [::this_t] {
  char [A::] c;   
};

Компилятор делает нечто вроде A_char_c? Т.е. это то, как «выглядит» переменная на, практически, самом нижнем уровне? Еще одна вещь, над которой я раньше не задумывался..


Это сообщение отредактировал(а) Gunslinger - 20.2.2010, 15:01
PM MAIL   Вверх
mes
Дата 20.2.2010, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  20.2.2010,  13:54 Найти цитируемый пост)
Компилятор делает нечто вроде A_char_c?

ага, в принципе так, только в более удобном для него виде. И с функциями тоже самое.

Добавлено через 3 минуты и 4 секунды
Цитата(Gunslinger @  20.2.2010,  13:54 Найти цитируемый пост)
Т.е. это то, как «выглядит» переменная на, практически, самом нижнем уровне? 

1. не переменная, а ее имя.
2. на самом низшем имя заменяется на значения (например смещения), поэтому не на самом низшем, а после раскрытия всех скоупов (пространств имен)




--------------------
PM MAIL WWW   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.