掲示板ランキング  その他  シングル用  セミダブル用  ダブル用  ワイドダブル用  クィーン用  キング用


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7452

別関数で値をもつメンバー変数にアクセス方法について
投稿者---トコトコ(2007/05/20 14:41:35)


オブジェクト指向、C++の初心者です。
関数別でメンバー変数の使い方について教えてほしいです。
A.hでclass A にメンバー変数A1,A2,A3,メンバー関数Af1(),Af2()…
の宣言を、
B.hでclass B にメンバー変数B1,B2,B3,メンバー関数Bf1(),Bf2()…
の宣言をしたとき、
A.cppでメンバー関数Af1(),Af2()…の実装を、
B.cppでメンバー関数Bf1(),Bf2()…の実装をします。

さて、Af1()内でA* a_p1 , A a_o1とオブジェクトをつくり、
a_p1->A1 = 値; a_o1.A1 = 値;
と書けばメンバー変数A1に値が入ると思います。メンバー変数名は
同じでもオブジェクトが異なればそれぞれ別ものと思います。

ここで、私がわからないところは
”あるメソッド内でメンバー変数に格納された値を別の関数で利用する方法"です。

A.h、B.hをincludeしているB.cppにメソッドBf1()を実装するのですが、
別関数Af1()で作られたオブジェクトa_p1,a_o1のメンバー変数A1、A2…に格納された値をBf1()で利用するには、Bf1()の関数はどのように書けばよろしいでしょうか?

決まった形を描画し、そのデータをファイルに保存するときのことを考えています。○や△の情報をクラス別でメンバー変数に入れるようにし、現在の情報をその変数に代入します。保存用のクラス、関数を用意しているのですが、
あるタイミングでファイルに保存する際、○や△のオブジェクトのメンバー変数の値を保存するところで躓いています。
保存方法(CFile等)は教科書をみるとして、別クラスで値をひっぱる方法が知りたいです。

Af1()でオブジェクトを宣言してメンバー変数に値を入れたとき、
Af2() (同じクラスのメンバー関数)
Bf1() (別クラスのメンバー関数)
にてその値を利用したいときの記述方法についてです。

オブジェクトを宣言せずにメンバー変数をそのまま使うのかと思い、
B1=A1と書いたりしたのですが、コンパイルが通ってもうまく動作しません。

開発環境OSはWinXP、言語はVC++(2005)です。
不足している情報はあればご指摘願います。
よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:別関数で値をもつメンバー変数にアクセス方法について 7453 επιστημη 2007/05/20 15:44:24
<子記事> Re:別関数で値をもつメンバー変数にアクセス方法について 7462 yoh2 2007/05/22 00:23:25


No.7453

Re:別関数で値をもつメンバー変数にアクセス方法について
投稿者---επιστημη(2007/05/20 15:44:24)
http://blogs.wankuma.com/episteme/


>”あるメソッド内でメンバー変数に格納された値を別の関数で利用する方法"です。

利用したいメンバ変数を持ったインスタンスを
メソッドの引数に与える。

class A {
 int value;
public:
 int getValue() const { return value; }
 ...
};

class B {
public:
 void f(const A*);
 ...
};

void B::f(const A* pA) {
 int value = pA->getVAlue(); // ここで取得
 ...
}



この投稿にコメントする

削除パスワード

No.7454

Re:別関数で値をもつメンバー変数にアクセス方法について
投稿者---トコトコ(2007/05/20 21:32:00)


επιστημη さん、早速のご返答ありがとうございます。

メソッドで利用するなら
メソッドの引数にインスタンスを与えるということですね。
今回提示していただいた例ではgetValueを使っていらっしゃいますが、
これは直接pA->valueでもOKという認識でよろしいでしょうか。
(このvalueはクラスAのメンバ変数)
 
では、
例えば、class A のメソッドset()の実装にて
複数(たとえば2つ)オブジェクトを作ったとします。
A::set()
{
A* pA1;
A* pA2;
pA1->value = 1;
pA2->value = 2;
}
ただし、valueはクラスAのint型メンバ変数。

このとき、class Bのメソッドfuncでこれらの変数を利用したい場合、
実装では
void B::func(A* pA1, A* pA2)

int x = pA1->value;
int y = pA2->value;

という書き方になりますでしょうか。
つまり、メンバ変数を持ったインスタンスと同じ名前のものを
(型とインスタンス名)を引数にいれるということでしょうか。

ふと思ったのですが、
class Aのメンバ変数 a を
class Aのメソッド func();で使う際、
funcの実装にて A::func(){ a = 値;}と
A::func(){ A* pA ; pA->a = 値; }とは別物でしょうか?
戻り値や型は気にしないとしてですが。

次から次に申し訳ございません。ご協力よろしくお願いします。


この投稿にコメントする

削除パスワード

No.7455

Re:別関数で値をもつメンバー変数にアクセス方法について
投稿者---επιστημη(2007/05/20 23:36:43)
http://blogs.wankuma.com/episteme/


>A::set()
>{
> A* pA1;
> A* pA2;
> pA1->value = 1;
> pA2->value = 2;
>}

思いっきりマチガイ。
pA1, pA2 が差すインスタンスが不定。

>次から次に申し訳ございません。ご協力よろしくお願いします。

まずはきっちり教本を読んでください。



この投稿にコメントする

削除パスワード

No.7458

Re:別関数で値をもつメンバー変数にアクセス方法について
投稿者---トコトコ(2007/05/21 00:19:05)


επιστημη さん、ご指摘ありがとうございます。

>pA1, pA2 が差すインスタンスが不定。

void A::set()
{//仮に戻り値をvoidとします。
  A* pA1 = new A();
  A* pA2 = new A();

  pA1->value = 1;
  pA2->value = 2;

であっているかと思いますが…あまり自信がありません。
(持っている私の本は「明解C++」です)


この投稿にコメントする

削除パスワード

No.7459

Re:別関数で値をもつメンバー変数にアクセス方法について
投稿者---επιστημη(2007/05/21 00:25:10)
http://blogs.wankuma.com/episteme/


>void A::set()
>{//仮に戻り値をvoidとします。
>  A* pA1 = new A();
>  A* pA2 = new A();
>
>  pA1->value = 1;
>  pA2->value = 2;
>}
>であっているかと思いますが…あまり自信がありません。
>(持っている私の本は「明解C++」です)

deleteしないとメモリ・リーク起こします。



この投稿にコメントする

削除パスワード

No.7456

Re:別関数で値をもつメンバー変数にアクセス方法について
投稿者---επιστημη(2007/05/20 23:46:01)
http://blogs.wankuma.com/episteme/


>今回提示していただいた例ではgetValueを使っていらっしゃいますが、
>これは直接pA->valueでもOKという認識でよろしいでしょうか。

メンバ変数をpublicに晒すのは好ましくない。



この投稿にコメントする

削除パスワード

No.7457

Re:別関数で値をもつメンバー変数にアクセス方法について
投稿者---επιστημη(2007/05/20 23:47:43)
http://blogs.wankuma.com/episteme/


>void B::func(A* pA1, A* pA2)
>{
> int x = pA1->value;
> int y = pA2->value;
>}
>という書き方になりますでしょうか。
>つまり、メンバ変数を持ったインスタンスと同じ名前のものを
>(型とインスタンス名)を引数にいれるということでしょうか。

なぜ試してみない?

>class Aのメンバ変数 a を
>class Aのメソッド func();で使う際、
>funcの実装にて A::func(){ a = 値;}と
>A::func(){ A* pA ; pA->a = 値; }とは別物でしょうか?
>戻り値や型は気にしないとしてですが。

なぜ試してみない?



この投稿にコメントする

削除パスワード

No.7462

Re:別関数で値をもつメンバー変数にアクセス方法について
投稿者---yoh2(2007/05/22 00:23:25)


>さて、Af1()内でA* a_p1 , A a_o1とオブジェクトをつくり、
>a_p1->A1 = 値; a_o1.A1 = 値;
>と書けばメンバー変数A1に値が入ると思います。

そもそも、本当にAf1()内でクラスAのインスタンスを作りたいのですか?
Af1()内でAのインスタンスを作って、それに値を設定するということは、
1. クラスAのあるインスタンス a1 に対してAf1()を呼び出すと、
2. クラスAの別のインスタンス a2 ができて(a1ではなく)a2に値が設定される。
と、不思議な挙動を示すということですが。

ここでa1とa2に関連性がないということは、
> メンバー変数名は同じでもオブジェクトが異なればそれぞれ別ものと思います。
ということが分かっているなら理解できますよね。

本当はこういうことをしたいのではないですか?
    // Aのメンバ関数内でもBのメンバ関数内でもないどこか
    A a1;
    ...
    a1.Af1(); // a1に何か(Af1())行う。
    a1.Af2(); // Af1()を行った後のa1に別の何か(Af2())を行う。
    ...
    B b1;
    ...
    b1.Bf1(a1); // Af1()、Af2適用後のa1の内容を使って、b1が何か(Bf1())を行う。



この投稿にコメントする

削除パスワード

No.7489

Re:別関数で値をもつメンバー変数にアクセス方法について
投稿者---トコトコ(2007/06/04 01:34:46)


επιστημηさん、yoh2さん
ご返答が遅れましたこと深くお詫び申し上げます。
出向先での開発環境のためすぐに試せず、また他の方がコーディングすることになったという非常に無様な話に
なってしまいました。
ExpressEditionという無料の環境があるみたいなので自宅で試そうと思います。なかなか勉強する余裕もございませんが。
 
>そもそも、本当にAf1()内でクラスAのインスタンスを作りたいのですか?
大まかな話ですが、例えば、
図形クラス、○クラス、△クラスがあって、
図形クラスのメソッドの実装部で
○クラス、△クラスのnew演算子でポインタ型のオブジェクトを生成します。
生成して、それぞれのクラスのメソッドを呼びます。
これらメソッド内ではポインタ型のインスタンスを生成してメンバ変数に値を代入します。メソッドの戻り値はこのポインタ型のインスタンスです。この戻り値を図形クラスのメソッド内で受け取り、リストに入れて管理するのだそうです。(最後にファイルにメンバ変数の値を保存する流れです。)
初心者の私にはよくわかりませんが。

yoh2さんが仰った
>Af1()内でAのインスタンスを作って、それに値を設定するということは、
>1. クラスAのあるインスタンス a1 に対してAf1()を呼び出すと、
>2. クラスAの別のインスタンス a2 ができて(a1ではなく)a2に値が設定される。
>と、不思議な挙動を示すということですが。
とはこういうことでしょうか。例えば簡単に書きますが、
void A::Af1()
{ A a1;
a1.Af2();
 return;
}

void A::Af2()
{ A a2;
a2.member = xxx;// xxxはmemberの型にあった値
  return;
}

>本当はこういうことをしたいのではないですか?
はい。Aクラスのメソッドで生成したインスタンスをBクラスのメソッドで
参照したいです。クラス別でCPPファイルにコーディングするので、どうすれば利用できるのかよくわからなくて。
  
ただ、そのコーディングをされた方のコードを(わからないながら)みると、メソッドの引数が空だったんです。
不思議に思っていますが。
リストで管理しているからリストにインスタンスを代入して、
必要なときにGetAtしているのかと想像してますがあくまで想像です。
コードを持ち出す、印刷するわけにいかないもので詳細を伝えれず申し訳ないです。

ご協力いただきありがとうございました。


この投稿にコメントする

削除パスワード

No.7490

Re:別関数で値をもつメンバー変数にアクセス方法について
投稿者---yoh2(2007/06/04 22:53:19)


>ただ、そのコーディングをされた方のコードを(わからないながら)みると、メソッドの引数が空だったんです。
>不思議に思っていますが。

何故メンバ関数の中で新たにインスタンスを作りたがるのか不思議に思って
いたのですが、上の文から何となく見当が付いた気が。
もしかしてこのキーワードで全部解決したりしませんか?

「thisポインタ」


この投稿にコメントする

削除パスワード

No.7497

Re:別関数で値をもつメンバー変数にアクセス方法について
投稿者---かずま(2007/06/05 22:17:39)


> 大まかな話ですが、例えば、
> 図形クラス、○クラス、△クラスがあって、
> 図形クラスのメソッドの実装部で
> ○クラス、△クラスのnew演算子でポインタ型のオブジェクトを生成します。
> 生成して、それぞれのクラスのメソッドを呼びます。
> これらメソッド内ではポインタ型のインスタンスを生成してメンバ変数に値
> を代入します。メソッドの戻り値はこのポインタ型のインスタンスです。
> この戻り値を図形クラスのメソッド内で受け取り、リストに入れて管理する
> のだそうです。(最後にファイルにメンバ変数の値を保存する流れです。)

リストの代わりに配列 katachi[] にしてしまいましたが、
次のようなことがしたいんじゃないのかな?
#include <iostream>

struct Point {
    double x, y;

    Point(double x = 0, double y = 0) : x(x), y(y) { }
};

class Katachi {
public:
    virtual void print() const = 0;
};

class Maru : public Katachi {
    Point c;
    double r;
public:
    void set(Point center, double radius) { c = center; r = radius; }

    void print() const {
        std::cout << "maru: "
            << "(" << c.x << "," << c.y << "), " << r << "\n";
    }
};

class Sankaku : public Katachi {
    Point v[3];
public:
    void set(Point a, Point b, Point c) { v[0] = a; v[1] = b; v[2] = c; }

    void print() const {
        std::cout << "sankaku: "
            << "(" << v[0].x << "," << v[0].y << "), "
            << "(" << v[1].x << "," << v[1].y << "), "
            << "(" << v[2].x << "," << v[2].y << ")\n";
    }
};

class Zukei {
    Katachi *katachi[10];
    int n;
public:
    Zukei() : n(0) { }
    ~Zukei() { for (int i = 0; i < n; i++) delete katachi[i]; }

    void set() {
        Maru *maru = new Maru;
        maru->set(Point(0, 0), 1);
        katachi[0] = maru;   n = 1;

        Sankaku *sankaku = new Sankaku;
        sankaku->set(Point(1, 1), Point(1, -1), Point(2, 0));
        katachi[1] = sankaku;  n = 2;

        maru = new Maru;
        maru->set(Point(1, 0), 2);
        katachi[2] = maru;   n = 3;
    }

    void print() const {
        for (int i = 0; i < n; i++) katachi[i]->print();
    }
};

int main()
{
    Zukei z;
    z.set();
    z.print();
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ