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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Два класса, Две одинаковые переменные 
V
    Опции темы
JAnty
Дата 29.3.2007, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

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



Вот:
Код

class c_CL1
{
public:
AnsiString str;
/*
...
*/
c_CL1(void); // конструктор, в нём str становится str="Привет";
};
///////////////////////////////////////////////
class c_CL2 : public c_CL1
{
public:
// AnsiString str;
/*
...
*/
c_CL2(void); // конструктор
};

Код

c_CL1 CL1;
c_CL2 CL2; 
main()
{
printf("%s",CL2.str); // не получается.
printf("%s",CL1.str); // получается.
}

А если во 2м классе объявлю AnsiString str и в конструкторе присвою "Привет", то получится.
Чо за фигня? /*Консольное написал для примера, пишу в Билдере.*/




--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
Greeen
Дата 29.3.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 7
Всего: 18



Код

#include <iostream>

class class1
{
public:
    int a;
    class1() { a = 5; }
};

class class2 : public class1
{
public:
    class2() {}
};

void main()
{
    class1 cl1;
    class2 cl2;
    std::cout << cl1.a;
    std::cout << cl2.a;
}

Все нормально, вывод - 55 (VS 2005)


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
JAnty
Дата 29.3.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

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



А Билдер не хочет выводить.


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
maxim1000
Дата 29.3.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 17
Всего: 110



когда в потомке объявляется переменная, совпадающая по имени с переменной из базового класса, начинается путанница:
когда объект рассматривается, как базовый - str означает c_CL1::str
когда как потомок - c_CL2::str
вот и получается:
----- в случае с одним объявлением
1. при создании потомка вызывается конструктор предка, он заполняет переменную c_CL1::str
2. первый printf оперирует c_CL1::str
3. второй - тоже, потому что она наследуется
----- в случае с двумя объявлениями
1. при создании потомка вызывается конструктор предка, внутри этого конструктора объект рассматривается, как c_CL1, потому используется c_CL1::str
2. первый printf тоже рассматривает объект класса c_CL1::str, потому и работает с заполненной переменной
3. второй printf работает с c_CL2, в нём объявлена вторая переменная str, которая перекрывает первую (т.к. имена у них совпадают), так что printf выводит c_CL2::str

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


--------------------
qqq
PM WWW   Вверх
Greeen
Дата 29.3.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 7
Всего: 18



JAnty, Билдер на свалку  smile 


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
Fazil6
Дата 29.3.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(JAnty @  29.3.2007,  11:59 Найти цитируемый пост)
А если во 2м классе объявлю AnsiString str и в конструкторе присвою "Привет", то получится.Чо за фигня? /*Консольное написал для примера, пишу в Билдере.*/

все должно выводится. Специально даже попроверил - все выводится...
PM MAIL   Вверх
JAnty
  Дата 29.3.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

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



Мда, в этом ООП сам чёрт ногу сломит.
Чтом я ногу не сломил, поменял названия да и всё, проподи оно всё проподом. smile

Добавлено через 2 минуты и 37 секунд
В новом проекте и у меня выводится, а в моём нет! Так что пришлось менять переменную.


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
Fazil6
Дата 29.3.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



maxim1000, и что следует из того, что ты написал?
PM MAIL   Вверх
_stranger_
Дата 29.3.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

printf("%s",CL2.str); // не получается.
printf("%s",CL1.str); // получается.

JAnty что значит не получается? какие ошибки? что выводит?
PM MAIL   Вверх
maxim1000
Дата 29.3.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 17
Всего: 110



Цитата(Fazil6 @  29.3.2007,  13:13 Найти цитируемый пост)
maxim1000, и что следует из того, что ты написал?

ну, в основном, это было написано в ответ на вопрос "почему?" (приблизительно цитирование smile)
вот я и попытался объяснить, почему всё происходит так, как оно происходит
ну а в качестве следствия можно рассматривать совет, что так делать в большинстве случаев не стоит...


--------------------
qqq
PM WWW   Вверх
JAnty
  Дата 29.3.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

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



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

#include <iostream>

class class1
{
public:
    int a;
    CONSTRUCTOR() { a = 5; }
};

class class2 : public class1
{
public:
    class2() {}
};

void main()
{
    class1 cl1;
    class2 cl2;
    class1.CONSTRUCTOR() ;
    std::cout << cl1.a;
    std::cout << cl2.a;
}



Выведет 5 и всё;

Добавлено через 7 минут и 1 секунду
Приходится дописывать ещё и 
class2.CONSTRUCTOR() ;

переменная одна, зачем ей 2 раза присваивать значение, а если мне надо её прочесть из одного класса а записать в другом, то неполучится, т.к а одна для одного класса, а другая для другого.


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
apook
Дата 29.3.2007, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 23



как так пишешь
Код

    class1.CONSTRUCTOR() ;

работает что-ли


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Fazil6
Дата 29.3.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Код

 class1.CONSTRUCTOR() ; 

хм... оригинально... У тебя это компиллируется?


А вообще

Цитата(JAnty @  29.3.2007,  13:30 Найти цитируемый пост)
Раз переменная открытая, то она должна быть видна в обоях классах, но нет, видна но без знасения.

по твоему примеру если предположить cl1.CONSTRUCTOR() ; , то это ведь для первого объекта. С чего во втором объекте твоя переменная должна инициализироваться? Вот и нет во втором значения

PM MAIL   Вверх
Greeen
Дата 29.3.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 7
Всего: 18



И зачем такие извращения  smile 


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
Fazil6
Дата 29.3.2007, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(JAnty @  29.3.2007,  13:30 Найти цитируемый пост)
переменная одна, зачем ей 2 раза присваивать значение, а если мне надо её прочесть из одного класса а записать в другом, то неполучится, т.к а одна для одного класса, а другая для другого.

ты бы проводил различия между классами и их объектами. У каждого объекта класса свои переменные, и когда ты в одном меняешь, то в другом естественно ничего не меняется
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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