То, что вы видите, это адреса формальных параметров вашей функции. По сути бессмысленные значения, которые бесполезны и по сути будут указателями на случайную позицию в вашем стеке - где бы ни находился стек, когда вы вызывали конструктор. В принципе, вам никогда не будут интересны эти значения, если вы не попытаетесь узнать больше о том, как работает ваш компьютер и компилятор.
Очень важно понимать, что делают указатели и когда они уместны, и каковы их последствия.
В этом случае не рекомендуется использовать указатели, потому что:
- Вы пытаетесь хранить данные внутри своего класса, и тип, который вы храните:
- В любом случае тот же размер, что и указатель (int)
- Нет причин хранить память за пределами вашего класса (в любом случае, не показано)
- даже если вам нужно, ссылки будут менее подвержены ошибкам (int & вместо int *)
- Кроме того, вы используете кучу для создания экземпляра вашего класса, когда стек будет работать нормально.
Я подозреваю, что это то, что вы намеревались:
class AndroideAbstracto {
protected:
int vida;
int fuerza;
int velocidad;
public:
void setvalores(int vi, int fu, int ve) {
velocidad = ve;
vida = vi;
fuerza = fu;
};
virtual void imprimir(void) = 0;
};
class Androide : public AndroideAbstracto {
public:
void imprimir() {
std::cout << "Caracteristicas del androide:" << endl;
cout << "Velocidad = " << velocidad << endl;
cout << "Vida = " << vida << endl;
cout << "Fuerza = " << fuerza << endl;
};
};
Обратите внимание на отсутствие * как в типах членов класса, так и при распечатке значений.
Одно не очень удачное, но синтаксически правильное использование указателей здесь было бы для запроса нескольких значений в классе одним вызовом (помещенным в любой класс):
void getvalores(int *vi, int *fu, int *ve) {
if (vi)
*vi = vida;
if (fu)
*fu = fuerza;
if (ve)
*ve = velocidad;
}
называется так, например:
int vida, velocidad;
andro->getvalores(&vida, NULL, &velocidad);
cout << "Velocidad = " << velocidad << endl;
cout << "Vida = " << vida << endl;
Здесь мы передали адрес переменных стека vida и velocidad как указатели и передали NULL, где мы могли бы передать дополнительный адрес, потому что нам не нужно значение fuerza. Затем мы присваиваем памяти, на которую указывают переданные указатели, если они не равны NULL, и когда функция возвращает, переменные стека имеют значения из класса.
Конечно, вы не должны этого делать - вы просто должны предоставить доступ к значениям другим способом, либо напрямую, либо сделав их общедоступными, либо добавив функции, которые просто возвращают их.
public:
int Vida() {
return vida;
}
Тогда вы можете просто сделать:
cout << "Vida = " << andro->Vida() << endl;
И, конечно, если нет причины использовать кучу для создания экземпляра Androide, вам следует просто использовать стековую память вместо кучи.
Androide andro;
вместо
Androide *andro = new Androide();