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


Автор: Karisha 24.10.2008, 03:06
Привет всем! У меня снова вопрос!

Задали такую задачку.

Есть 1 главный класс и 3 наследуемых.

Код

class A {
public:
    int id;
    void funcA();
};
 
class B : public A {
public:
    void funcB();
};

class C : public A {
public:
    void funcC();
};

class D : public A {
public:
    void funcD();
};

Как из функций:
  • void funcB()
  • void funcС()
  • void funcD()
получить значение переменной id?

Автор: J0ker 24.10.2008, 03:15
id

Автор: Karisha 24.10.2008, 03:19
не получается, выдает случайное 9 значное число

Автор: mes 24.10.2008, 03:45
Цитата(Karisha @  24.10.2008,  03:19 Найти цитируемый пост)
не получается, выдает случайное 9 значное число

так ты ее не инициализируешь, поэтому переменная хранит муссор.

А вообше переменную надо спрятать в private: , и добавить функцию int GetID () const { return id; }
которую поместить в public: если нужна всем или в protected: если никто кроме наследников не должен знать этот номер.

Автор: J0ker 24.10.2008, 05:01
Цитата(Karisha @  24.10.2008,  03:19 Найти цитируемый пост)
не получается, выдает случайное 9 значное число

это два противоположных утверждения

Автор: bsa 24.10.2008, 11:12
Код
class A
{
public:
    A() : id_(0) {} //конструктор инициализирует переменную id_
    void funcA();
    int id() const { return id_; }
    void setId(int value) { id_ = value; }
private:
    int id_;
};

Автор: Karisha 24.10.2008, 18:18
Ничего не поняла из Вашего примера smile 

Код

class A {
public:
    int id;
    void funcA();
};
 
class B : public A {
public:
    void funcB();
};
class C : public A {
public:
    void funcC();
};
class D : public A {
public:
    void funcD();
};
void A::funcA() {
   // как тут присвоить id ноль?
}
void B::funcB() {
    // как тут вывести id а потом увеличить его на единицу?
}
void С::funcС() {
    // как тут вывести id а потом увеличить его на единицу?
}
void D::funcD() {
    // как тут вывести id а потом увеличить его на единицу?
}


Я извиняюсь, но для меня c++ как тайская грамота =/

Автор: J0ker 24.10.2008, 18:57
Код

#include <iostream>
using namespace std;

class A {
public:
    int id;
    void funcA();
};
 
class B : public A {
public:
    void funcB();
};
class C : public A {
public:
    void funcC();
};
class D : public A {
public:
    void funcD();
};
void A::funcA() {
   // как тут присвоить id ноль?
   id = 0;
}
void B::funcB() {
    // как тут вывести id а потом увеличить его на единицу?
    cout << id++ << endl;
}
void С::funcС() {
    // как тут вывести id а потом увеличить его на единицу?
    cout << id++ << endl;
}
void D::funcD() {
    // как тут вывести id а потом увеличить его на единицу?
    cout << id++ << endl;
}

Автор: Karisha 24.10.2008, 19:21
Все равно выводит случайные числа

Код

karisha@computer:~/develop/cc$ g++ a.cpp
karisha@computer:~/develop/cc$ ./a.out
4197184
375155416
375155432
karisha@computer:~/develop/cc$ 

Код

#include <iostream>
using namespace std;
class A {
public:
    int id;
    void funcA();
};
 
class B : public A {
public:
    void funcB();
};

class C : public A {
public:
    void funcC();
};

class D : public A {
public:
    void funcD();
};

void A::funcA() {
   // как тут присвоить id ноль?
   id = 0;
}
void B::funcB() {
    // как тут вывести id а потом увеличить его на единицу?
    cout << id++ << endl;
} 
void C::funcC() {
    // как тут вывести id а потом увеличить его на единицу?
    cout << id++ << endl;
}
void D::funcD() {
    // как тут вывести id а потом увеличить его на единицу?
    cout << id++ << endl;
}

int main() {
    A myA;
    B myB;
    C myC;
    D myD;
    myA.funcA();
    myB.funcB();
    myC.funcC();
    myD.funcD();
    return 0;
}

Автор: J0ker 24.10.2008, 19:57
Цитата(Karisha @  24.10.2008,  19:21 Найти цитируемый пост)
Все равно выводит случайные числа

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

Автор: mes 24.10.2008, 19:58
Цитата(Karisha @  24.10.2008,  19:21 Найти цитируемый пост)
Все равно выводит случайные числа


Цитата(Karisha @  24.10.2008,  19:21 Найти цитируемый пост)
    A myA;
    B myB;
    C myC;
    D myD;
    myA.funcA();
    myB.funcB();
    myC.funcC();
    myD.funcD();


обратите внимание что у Вас  четыре разных объекта myA, myB, myC, myD. У каждого из них свои переменные, и действия над ними не пересекаются. Конечно можно объявить переменнуую обшей для всех объектов определенной иерархии, но название переменной (id ) говорит, что она должна быть у каждого объекта своя. 

Цитата(Karisha @  24.10.2008,  18:18 Найти цитируемый пост)

Я извиняюсь, но для меня c++ как тайская грамота =/

Ну тогда Вы  к вопросу не с того боку подошли. Что у Вас за задание ?

Автор: Karisha 24.10.2008, 20:00
Мне нужно в Классе А,  присвоить переменной id - ноль.
В классе B увеличить значение переменной на единицу, и вывести его (т.е. присвоить id - 1)
В классе С увеличить значение переменной на единицу, и вывести его (т.е. присвоить id - 2)
В классе D увеличить значение переменной на единицу, и вывести его (т.е. присвоить id - 3)

Автор: mes 24.10.2008, 20:04
Цитата(Karisha @  24.10.2008,  20:00 Найти цитируемый пост)
Мне нужно в Классе А,  присвоить переменной id - ноль.
В классе B увеличить значение переменной на единицу, и вывести его (т.е. присвоить id - 1)
В классе С увеличить значение переменной на единицу, и вывести его (т.е. присвоить id - 2)
В классе D увеличить значение переменной на единицу, и вывести его (т.е. присвоить id - 3) 

Это задание надуманое , так как у класса нет переменных(статические тоже под описание не подходят). Вы что то перепутали.

Добавлено через 3 минуты и 54 секунды
Цитата(Karisha @  24.10.2008,  19:21 Найти цитируемый пост)
   A myA;
    myA.funcA();


обратите внимание на то что класс называется A, а работаете вы с myA - который является объектом класса А. 

Автор: J0ker 24.10.2008, 20:08
вынесите id из класса
Код

#include <iostream>
using namespace std;

int id;

class A {
public:
    void funcA();
};

class B : public A {
public:
    void funcB();
};
class C : public A {
public:
    void funcC();
};
class D : public A {
public:
    void funcD();
};
void A::funcA() {
   // как тут присвоить id ноль?
   id = 0;
}
void B::funcB() {
    // как тут вывести id а потом увеличить его на единицу?
    cout << id++ << endl;
} 
void C::funcC() {
    // как тут вывести id а потом увеличить его на единицу?
    cout << id++ << endl;
}
void D::funcD() {
    // как тут вывести id а потом увеличить его на единицу?
    cout << id++ << endl;
}
int main() {
    A myA;
    B myB;
    C myC;
    D myD;
    myA.funcA();
    myB.funcB();
    myC.funcC();
    myD.funcD();
    return 0;
}

либо объявите ее внутри класса как static:
Код

#include <iostream>
using namespace std;
class A {
public:
    static int id;
    void funcA();
};

int A::id;
 
class B : public A {
public:
    void funcB();
};
class C : public A {
public:
    void funcC();
};
class D : public A {
public:
    void funcD();
};
void A::funcA() {
   // как тут присвоить id ноль?
   id = 0;
}
void B::funcB() {
    // как тут вывести id а потом увеличить его на единицу?
    cout << id++ << endl;
} 
void C::funcC() {
    // как тут вывести id а потом увеличить его на единицу?
    cout << id++ << endl;
}
void D::funcD() {
    // как тут вывести id а потом увеличить его на единицу?
    cout << id++ << endl;
}
int main() {
    A myA;
    B myB;
    C myC;
    D myD;
    myA.funcA();
    myB.funcB();
    myC.funcC();
    myD.funcD();
    return 0;
}


Добавлено через 3 минуты и 7 секунд
Цитата(Karisha @  24.10.2008,  20:00 Найти цитируемый пост)
Мне нужно в Классе А,  присвоить переменной id - ноль.
В классе B увеличить значение переменной на единицу, и вывести его (т.е. присвоить id - 1)
В классе С увеличить значение переменной на единицу, и вывести его (т.е. присвоить id - 2)
В классе D увеличить значение переменной на единицу, и вывести его (т.е. присвоить id - 3) 



Цитата(Karisha @  24.10.2008,  19:21 Найти цитируемый пост)
// как тут вывести id а потом увеличить его на единицу?
// как тут вывести id а потом увеличить его на единицу?
// как тут вывести id а потом увеличить его на единицу?


вы уж определитесь

Автор: Karisha 24.10.2008, 20:14
mes,J0ker , спасибо огромное за помощь, всё заработало!

Автор: J0ker 24.10.2008, 20:22
да уж
о понимании кода мы скромно промолчим...

Автор: mes 24.10.2008, 20:22
Цитата(Karisha @  24.10.2008,  20:14 Найти цитируемый пост)
спасибо огромное за помощь, всё заработало!

толку то от того что заработало... Было бы лучше, если бы бы Вам пришло понимание процесса.

Автор: eyeofhell 27.10.2008, 16:13
Моя телепатия сейчас на удивление сильна, несмотря на понедельник. Ему нужно было написать пример наследования, при котором в конструкторе A переменная инициализируется, в конструкторе потомка увеличивается на 1 и выводится на экран, в конструкторе следующего потомка опять увеличивается на 1 и так далее. Вообщем иллюстрация порядка вызова конструкторов при наследовании.

Автор: J0ker 27.10.2008, 17:50
eyeofhell, ну это вряд-ли
он бы не придумал такие названия как void funcB() void funcС() void funcD() - явно препод постарался...
но, честно говоря, чему должен был научить данный пример для меня осталось загадкой... разве что static переменные в классе

Автор: mes 27.10.2008, 18:05
Цитата(J0ker @  27.10.2008,  17:50 Найти цитируемый пост)
разве что static переменные в классе 

но название перменой id эту догадку  тоже ставит под сомнение..  smile 

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