Форум программистов, компьютерный форум CyberForum.ru

Полиморфизм в с++ - C++

Восстановить пароль Регистрация
 
bull3tproof
0 / 0 / 0
Регистрация: 28.03.2013
Сообщений: 26
12.12.2013, 21:44     Полиморфизм в с++ #1
Вообщем я делал программу,изначально в ней было реализовано наследование.Затем дали задание реализовать полиморфзим для функции Scale для классов сфера и паралепипед.Делал все ,как обьясняли в колледже,однако возникает ошибки при обращении к функциям и обьектам в файле где основная програма.Помогите испрвить пожалуйста.Виртуальная фунцкия обьявлена в родительском классе Object.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#pragma once
 
class Object
{
protected:
    double  x, 
            y, 
            z;
public:
 
    virtual void Scale () = 0;
    Object();
    Object(double x, double y, double z);
 
    void Move(double x, double y, double z);
 
    double GetXCord();
    double GetYCord();
    double GetZCord();
};
 
Object::Object()
{
    x = y = z = 0.0;
}
 
Object::Object(double x, double y, double z)
{
    this->x = x;
    this->y = y;
    this->z = z;
}
 
void Object::Move(double x, double y, double z)
{
    this->x = x;
    this->y = y;
    this->z = z;
}
 
double Object::GetXCord()
{
    return x;
}
 
double Object::GetYCord()
{
    return y;
}
 
double Object::GetZCord()
{
    return z;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "Object.h"
 
class Paralelp : 
    public Object
{
protected:
    double  height, 
            width, 
            length;
public:
    Paralelp();
    Paralelp(double x, double y, double z, double height, double width, double length);
    Paralelp(double height, double width, double length);
 
    
    void SetHeight(double height);
    double GetHeight();
 
    void SetWidth(double width);
    double GetWidth();
 
    void SetLength(double length);
    double GetLength();
    
    void Scale(double volume);
    
 
    friend double CalcVolume(Paralelp &a);
};
 
#include <math.h>
 
Paralelp::Paralelp() : Object()
{
    height = width = length = 1.0;
}
 
Paralelp::Paralelp(double x, double y, double z, double height, double width, double length) : Object(x, y, z)
{
    this->height = height;
    this->width = width;
    this->length = length;
}
 
Paralelp::Paralelp(double height, double width, double length) : Object()
{
    this->height = height;
    this->width = width;
    this->length = length;
}
 
void Paralelp::SetHeight(double height)
{
    this->height = height;
}
 
double Paralelp::GetHeight() { return height; }
 
void Paralelp::SetWidth(double width)
{
    this->width = width;
}
 
double Paralelp::GetWidth() { return width; }
 
void Paralelp::SetLength(double length)
{
    this->length = length;
}
 
double Paralelp::GetLength() { return length; }
 
double CalcVolume(Paralelp &a)
{
    return a.height * a.width * a.length;
}
 
void Paralelp::Scale(double volume)
{
    double temp_v = CalcVolume(*this);
    temp_v =  volume / temp_v;
    temp_v = pow(temp_v, 1.0 / 3.0);
    height *= temp_v;
    width *= temp_v;
    length *= temp_v;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "Object.h"
 
class Sphere : 
    public Object
{
protected:
    double radius;
public:
    Sphere();
    Sphere(double x, double y, double z, double radius);
    Sphere(double radius);
 
    void SetRadius(double radius);
    double GetRadius();
    void Scale ();
    void Scale(double volume);
    void Sphere::Scale();
    friend double CalcVolume(Sphere &a);
};
 
#include <math.h>
 
Sphere::Sphere() : Object()
{
    radius = 1;
}
 
Sphere::Sphere(double x, double y, double z, double radius) : Object(x, y, z)
{
    this->radius = radius;
}
 
Sphere::Sphere(double radius) : Object()
{
    this->radius = radius;
}
 
void Sphere::SetRadius(double radius)
{
    this->radius = radius;
}
 
double Sphere::GetRadius() { return radius; }
 
double CalcVolume(Sphere &a)
{
    return 3.414 * a.radius * a.radius;
}
 
void Sphere::Scale(double volume)
 
{
    double temp_v = CalcVolume(*this);
    temp_v = volume / temp_v;
    temp_v = sqrt(temp_v);
    radius *= temp_v;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdio.h>
#include "Sphere.h"
#include "Paralelp.h"
#include <ctime> 
#include <Windows.h>
#include <locale.h>
 
 
void PrintParalelpInfo(Paralelp a)
{
    
    printf("x = %.3f; y = %.3f; z = %.3f;\nh = %.3f; w = %.3f; l = %.3f;\n", a.GetXCord(), a.GetYCord(), a.GetZCord(),  a.GetHeight(), a.GetWidth(), a.GetLength());
    printf("Volume is: %.3f\n", CalcVolume(a));
}
 
void PrintSphereInfo(Sphere a)
{
        
        printf("x = %.3f; y = %.3f; z = %.3f; R = %.3f;\n", a.GetXCord(), a.GetYCord(), a.GetZCord(),   a.GetRadius());
        printf("Volume is: %.3f\n", CalcVolume(a));
}
 
 
void main()
{
    
 
    srand((int)time(NULL));
 
    Paralelp a;
    Sphere c;
 
    Object *AbstractObject;
    Paralelp *Par = new Paralelp; 
    Sphere *Sph = new Sphere;
 
    AbstractObject = Par;
     AbstractObject->Scale;
 
    AbstractObject = Sph;
    AbstractObject->Scale;
 
    printf("Standart paralelp. A:\n");
    PrintParalelpInfo(a);
    printf("\n Standart sphere C:\n");
    PrintSphereInfo(c);
 
    float x, y, z;
 
    printf("\n\n Create new paralelp\n");
    printf("Set x: ");
    scanf_s("%f", &x, sizeof(x));
    printf("Set y: ");
    scanf_s("%f", &y, sizeof(y));
    printf("Set z: ");
    scanf_s("%f", &z, sizeof(z));
 
    Paralelp b(x, y, z, ((double)(rand() % 1000) / 100.0) + 1, ((double)(rand() % 1000) / 100.0) + 1, ((double)(rand() % 1000) / 100.0) + 1);
 
    printf("\n Paralelp. B:\n");
    PrintParalelpInfo(b);
 
    printf("Move and size\n");
    AbstractObject->b.Scale(rand() % 150 + 1);
    b.Move(((double)(rand() % 10000) / 100.0) - 50, ((double)(rand() % 10000) / 100.0) - 50, ((double)(rand() % 10000) / 100.0) - 50);
 
    printf("\n Paralelp B:\n");
    PrintParalelpInfo(b);
    
    printf("\n\n Creating sphere.\n");
    printf("set x: ");
    scanf_s("%f", &x, sizeof(x));
    printf("set y: ");
    scanf_s("%f", &y, sizeof(y));
    printf("set z: ");
    scanf_s("%f", &z, sizeof(z));
 
    Sphere d (x, y, z, ((double)(rand() % 900) / 100.0) + 1);
 
    printf("\n Sphere D:\n");
    PrintSphereInfo(d);
 
    printf("Move and size\n");
    d.Move(((double)(rand() % 10000) / 100.0) - 50, ((double)(rand() % 10000) / 100.0) - 50, ((double)(rand() % 10000) / 100.0) - 50);
    AbstractObject->d.Scale(rand() % 150 + 1);
 
    printf("\n Sphere  D:\n");
    PrintSphereInfo(d);
    
    system("pause");
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2013, 21:44     Полиморфизм в с++
Посмотрите здесь:

C++ Полиморфизм
C++ Полиморфизм
полиморфизм=( C++
C++ полиморфизм
C++ Полиморфизм
Полиморфизм. C++
Полиморфизм c++ C++
C++ Полиморфизм
Полиморфизм C++
C++ С++ и полиморфизм
C++ Полиморфизм
C++ Полиморфизм

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
180 / 180 / 21
Регистрация: 24.03.2011
Сообщений: 647
Завершенные тесты: 1
12.12.2013, 21:48     Полиморфизм в с++ #2
Цитата Сообщение от bull3tproof Посмотреть сообщение
AbstractObject->Scale;
Может, здесь? Scale это ж функция...
А вообще ошибки нужно выкладывать.
bull3tproof
0 / 0 / 0
Регистрация: 28.03.2013
Сообщений: 26
12.12.2013, 22:05  [ТС]     Полиморфизм в с++ #3
ну и как обратиться ?

Добавлено через 5 минут
>c:\users\vlad\desktop\lab5\lab5\lab5\lalka.cpp(38): error C3867: 'Object::Scale': function call missing argument list; use '&Object::Scale' to create a pointer to member
1>c:\users\vlad\desktop\lab5\lab5\lab5\lalka.cpp(41): error C3867: 'Object::Scale': function call missing argument list; use '&Object::Scale' to create a pointer to member
1>c:\users\vlad\desktop\lab5\lab5\lab5\lalka.cpp(64): error C2039: 'b' : is not a member of 'Paralelp'
1> c:\users\vlad\desktop\lab5\lab5\lab5\paralelp.h(3) : see declaration of 'Paralelp'
1>c:\users\vlad\desktop\lab5\lab5\lab5\lalka.cpp(64): error C2228: left of '.Scale' must have class/struct/union
1>c:\users\vlad\desktop\lab5\lab5\lab5\lalka.cpp(85): error C2039: 'd' : is not a member of 'Sphere'
1> c:\users\vlad\desktop\lab5\lab5\lab5\sphere.h(3) : see declaration of 'Sphere'
1>c:\users\vlad\desktop\lab5\lab5\lab5\lalka.cpp(85): error C2228: left of '.Scale' must have class/struct/union
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
12.12.2013, 22:13     Полиморфизм в с++ #4
AbstractObject->Scale();
Обращения к функциям ведь со скобками.
bull3tproof
0 / 0 / 0
Регистрация: 28.03.2013
Сообщений: 26
12.12.2013, 22:26  [ТС]     Полиморфизм в с++ #5
Там испрвил.
AbstractObject->d.Scale(rand() % 150 + 1);
AbstractObject->b.Scale(rand() % 150 + 1);
ошибка в этих рядках,под "b" и "d".

Добавлено через 53 секунды
alka.cpp(85): error C2039: 'd' : is not a member of 'Sphere'
lalka.cpp(64): error C2039: 'b' : is not a member of 'Paralelp'
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
12.12.2013, 22:34     Полиморфизм в с++ #6
AbstractObject - это указатель на указатель на объект класса.
b,d - это просто объекты.
Эти два понятия в программе никак не связаны. Необходимо написать так b.Scale(rand() % 150 + 1);

Или же
C++
1
2
3
Sph = &b; 
AbstractObject = Sph;
AbstractObject->Scale(rand() % 150 + 1);
Yandex
Объявления
12.12.2013, 22:34     Полиморфизм в с++
Ответ Создать тему
Опции темы

Текущее время: 00:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru