Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с классами


Автор: dandy77 25.5.2009, 12:57
У меня есть два класса:

class CBaseClass
{
public:
    CBaseClass();
    int x_1;
    int y_1
    SetValue(int x, int y) {x_1=x;y_1=y};
};

CBaseClass::CBaseClass()
{
x_1=10;
y_1=12;
}

class CDeliveryClass : public CBaseClass
{

}

void main(void)
{
CDeliveryClass m_Class;
m_Class.SetValue(20,14);
}

Причем  как видите я устанавливаю в программе:

m_Class.SetValue(20,14);

но эта установка не срабатывает- все равно в расчетах в базовом классе используються значения, установленные в конструкторе, то есть 10 и 12:

CBaseClass::CBaseClass()
{
x_1=10;
y_1=12;
}

Что мне делать. Мне именно надо что бы так были переменные и их инициализция размещена в классах. Как мне сделать что бы срабатывало:

m_Class.SetValue(20,14);

??????????????????

Автор: zim22 25.5.2009, 13:15
Код

class CBaseClass {
public:
  CBaseClass() : x_1(10), y_1(12) { }    
  void SetValue(int x, int y) {
    x_1 = x;
    y_1=y;
  }
private:
  int x_1;
  int y_1;
};

class CDeliveryClass : public CBaseClass { };

int main()
{
  CDeliveryClass m_Class;
  m_Class.SetValue(20,14);

    return 0;
}



Автор: dandy77 25.5.2009, 13:44
Дело в том что мне надо что бы конструктор:

class CBaseClass {
public:
  CBaseClass() : x_1(10), y_1(12) { }  

был не пустой так как еще много инициализируеться других переменных. Это я в общих чертах привел пример свой.

Автор: math64 25.5.2009, 13:49
Ты что-то упустил важное из своего кода. Приведённый тобой код, и код zim22 должны работать одинаково.

Автор: dandy77 25.5.2009, 13:55
Вот так будет точнее:

class CBaseClass
{
public:
    CBaseClass();
    SetValue(int x=10, int y=12) {x_1=x;y_1=y}

protected:
    int x_1;
    int y_1
   
};

CBaseClass::CBaseClass()
{
x_1=10;
y_1=12;
}

class CDeliveryClass : public CBaseClass
{

}

void main(void)
{
CDeliveryClass m_Class;
m_Class.SetValue(20,14);
}

Автор: Peter 25.5.2009, 14:01
Цитата(dandy77 @  25.5.2009,  13:55 Найти цитируемый пост)
Вот так будет точнее

Что выше, что сейчас: синтаксические ошибки (на мой взгляд; компилятору я этот код не подсовывал).
После определения CDeliveryClass нет точки с запятой. Нет ее и после объявления переменной y_1.

Автор: azesmcar 25.5.2009, 14:03
Цитата(dandy77 @  25.5.2009,  13:55 Найти цитируемый пост)


CBaseClass::CBaseClass()
{
x_1=10;
y_1=12;
}

вместо инициализации используется присваивание. лишний вызов оператора присваивания..и что же конкретно тут лучше?

Автор: math64 25.5.2009, 14:05
Это тоже ничего не меняет. Ты вызываешь m_Class.SetValue(20,14); а не m_Class.SetValue();
Может у тебя есть поля int x_1,  int y_1; в CDeliveryClass? Они не инициализируются в SetValue().
Или SetValue() переопределён в CDeliveryClass, а ты не вызываешь CBaseClass::SetValue()?
(пользуйся кнопкой Код для оформления своего кода)

Автор: mes 25.5.2009, 14:08
Цитата(dandy77 @  25.5.2009,  11:57 Найти цитируемый пост)
но эта установка не срабатывает- все равно в расчетах в базовом классе используються значения, установленные в конструкторе, то есть 10 и 12:

Сколько раз приводили код, а место в котором на Ваш взгляд поведение отличается от ожидаемого скрыли.
Где ж те расчеты, которые ведут себя неверно ?

P.S. и оформляйте, пожалуйста, код тегами. Поверьте, Вам это будет не трудно, а форумчанам не надо будет ломать глаза и у них будет больше сил и желания на помощь Вам  smile 

Автор: dandy77 25.5.2009, 14:17
Спасибо за помощь ребята, я уже сделал, но еще не разобрался. Просто я на DirectX программирую, да еще пример взял из SDK. в SDK пример работает, а мой нет. функцию SetValue() с моими значениями я поместил в функцию рендеринга и все заработало. Теперь она вызываеться не один раз перед запуском приложения, а все время при каждой прорисовке. Почему я еще не знаю. А еще попробывал поместить SetValue() в конструктор CDeliveryClass тоже заработало.

Автор: mes 25.5.2009, 14:38
Цитата(dandy77 @  25.5.2009,  13:17 Найти цитируемый пост)
. Теперь она вызываеться не один раз перед запуском приложения, а все время при каждой прорисовке. Почему я еще не знаю.

потому что в main Вы устанавливаете  значения у другого Объекта, не тому, который используется при рендеринге. 
Для того чтоб разобраться, Вам необходимо понять разницу между классом/типом и объектом.


Автор: Cybernetic10 25.5.2009, 15:12
Цитата(dandy77 @  25.5.2009,  13:55 Найти цитируемый пост)
    
Код

SetValue(int x=10, int y=12) {x_1=x;y_1=y}

Разве в заголовке функции не задаются параметры по умолчанию? Я могу ошибаться, но при  записи
Код

function(int a = 10)
{
x_1 = a;
}

переменной x_1 всегда будет присваиваться 10?

Автор: azesmcar 25.5.2009, 15:16
Цитата(Cybernetic10 @  25.5.2009,  15:12 Найти цитируемый пост)
Разве в заголовке функции не задаются параметры по умолчанию? 

да smile 

Цитата(Cybernetic10 @  25.5.2009,  15:12 Найти цитируемый пост)
переменной x_1 всегда будет присваиваться 10? 

нет smile 
только когда параметр функции не передали.

Автор: zim22 25.5.2009, 15:21
Цитата(Cybernetic10 @  25.5.2009,  15:12 Найти цитируемый пост)
Разве в заголовке функции не задаются параметры по умолчанию? Я могу ошибаться, но при  записи

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

struct C {
  void fcn(int a = 10);
};
void C::fcn(int a = 10) { }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)