クラスを配列を使って管理する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
icon01
記事: 25
登録日時: 13年前

クラスを配列を使って管理する

#1

投稿記事 by icon01 » 12年前

クラスの作り方について質問があります。

三角形、長方形、円形の3つの面積を求めるプログラムをクラスを用いて作るのですが、途中まではできたものの、最後の「基底クラスの配列を用いて管理する」という条件がいまいちとっつきにくくて困っています。

例として、

コード:


for(int i = 0; i < 3; i++)
{
    cout << shape[i]->getname()<<"の面積は"
            << shape[i]->getariea() <<"です" << endl;
}
のように基底クラスのshapeに配列を持たせてやるらしいのですが、以下の私のコードにどう手を加えれば良いのか
、教えていただけないでしょうか。言葉足らずで申し訳ありませんがどうぞよろしくお願いいたします。

コード:


ヘッダー
#pragma once

//基底クラス
class shape
{
    public:

        virtual void getname(); //名前の表示

        virtual void getarea();  //演算結果
};

//三角形のクラス
class triangle:public shape
{
    private:

        float m_base;        //底辺
        float m_heght;      //高さ

    public:

        triangle(float base, float heght);

        void getname();
        void getarea();
};

//長方形のクラス
class rectangle:public shape
{
    private:

        float m_vertical;        //縦
        float m_horizontal;    //横

    public:
        rectangle(float verticl,float horizontal);

        void getname();
        void getarea();
};

//円形のクラス
class circle:public shape
{
    private:

        float m_radius;    //半径

    public:

        circle(float radius);

        void getname();
        void getarea();
};

cpp

#include"shape.h"
#include<iostream>

using namespace std;

triangle::triangle(float base, float heght)
{
    m_base = base;
    m_heght = heght;
}

rectangle::rectangle(float vertical,float horizontal)
{
    m_vertical = vertical;
    m_horizontal = horizontal;
}

circle::circle(float radius)
{
    m_radius = radius;
}

void shape::getarea()
{

}

void shape::getname()
{

}

//三角形の面積を求める
void triangle::getarea()
{
    float n;
	
    n = (m_base * m_heght)/2.0f;

    cout << n << endl;
}

//長方形の面積を求める
void rectangle::getarea()
{
    float n;

    n = m_vertical * m_horizontal;

    cout << n << endl;
}

//円の面積を求める
void circle::getarea()
{
    float n;

    n = (m_radius * m_radius) * 3.14f; //π = 3.14

    cout << n << endl;
}

void triangle::getname()
{
    cout << "三角形"  << endl;;
}

void rectangle::getname()
{
    cout << "長方形";
}

void circle::getname()
{
    cout << "円形";
}

int main(void)
{
    shape* p;
    //適当に数字をぶち込む
    triangle t(2.0f,6.0f);
    rectangle r(3.0f,3.0f);
    circle c(5.0f);

    //三角形
    p = &t;
    p->getname();
    p->getarea();

    //長方形
    p = &r;
    p->getname();
    p->getarea();

    //円
    p = &c;
    p->getname();
    p->getarea();

    system("pause>NUL");
    return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: クラスを配列を使って管理する

#2

投稿記事 by softya(ソフト屋) » 12年前

getnameやgetareaが値を戻さない実装なので、まずそこからダメだと思います。そこを直しましょう。
あとクラスのインスタンスをnewで生成してみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: クラスを配列を使って管理する

#3

投稿記事 by ISLe » 12年前

とりあえずmain関数をこんな感じに書き換えると何か見えてきませんか。

コード:

int main(void)
{
    shape *p[3];
    //適当に数字をぶち込む
    triangle t(2.0f,6.0f);
    rectangle r(3.0f,3.0f);
    circle c(5.0f);
 
    //三角形
    p[0] = &t;
    p[0]->getname();
    p[0]->getarea();
 
    //長方形
    p[1] = &r;
    p[1]->getname();
    p[1]->getarea();
 
    //円
    p[2] = &c;
    p[2]->getname();
    p[2]->getarea();
 
    system("pause>NUL");
    return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る