ページ 11

別ファイルのメンバ・オブジェクトの利用に関して

Posted: 2014年7月09日(水) 12:56
by てろっぷ
まず何をしたいのか書きます。

1)あるファイル(ExA.cpp)でクラスExAを定義する。(クラスExAはデータメンバint dataA、メンバ関数void funcA(int data)を持つ)
2)それとは別のファイル(main.cpp)でExA型のオブジェクトobjAを宣言する。
3)更に別のファイル(ExB.cpp)でクラスExBを定義する。
4)クラスExBのメンバ関数void funcB()内でobjA.funcA(objA.dataA)を使用する。
*クラスの宣言はそれらとは別のファイル(ExClass.h)で行われている。
*クラスExAのデータメンバint dataAはコンストラクタで初期化されている。

そして以下のようにソースコードを記述しました。

-- ExClass.h --

コード:

#ifndef ___EXCLASS
#define ___EXCLASS

class ExA {
public:
    ExA();
public:
    int  dataA;    //クラスExBでアクセスするためpublic
    void funcA(int data) const;
};

extern ExA objA;

class ExB {
public:
    ExB();
public:
    void funcB() const;
};

#endif
-- main.cpp --

コード:

#include "ExClass.h"

int main()
{
    ExA objA;
    /* -- 以下略 -- */
}
-- ExA.cpp --

コード:

#include "ExClass.h"

ExA::ExA() {
    //int dataAの初期化
    /* -- 以下略 -- */
}

void ExA::funcA(int data) const {
    /* -- 以下略 -- */
}
-- ExB.cpp --

コード:

#include "ExClass.h"

ExB::ExB() {
    /* -- 以下略 -- */
}

void ExB::funcB() const {
    objA.funcA(objA.dataA);
    /* -- 以下略 --*/
}
これをビルドした際、
「error LNK2001: 外部シンボル ""class ExA objA" (?objA@@3VExA@@A)" は未解決です。」
というエラーが出ます。

上記のコードの何処がいけないのでしょうか?
またより推奨される記述方法があれば教えて下さい。
お願い致しますm(__)m

使用言語 C/C++(主にC++)
OS Windows8.1
開発環境 Microsoft Visual Studio Express 2013 for Windows Desktop

Re: 別ファイルのメンバ・オブジェクトの利用に関して

Posted: 2014年7月09日(水) 13:21
by usao
extern とさえ書けば
変数が 「どこにあっても 唐突に 好き勝手に いじくれる」というわけではありません.

>またより推奨される記述方法があれば教えて下さい。
安易に extern などと書かなくてもよい方法を考えた方がよいのではないでしょうか.
(引数,戻り値 等としった仕組みを用いて.)

Re: 別ファイルのメンバ・オブジェクトの利用に関して

Posted: 2014年7月09日(水) 13:38
by てろっぷ
クラスExBにおいて必ずしもobjAの値を使わなければならなかったわけではないので、
ExB.cpp内で新たにExA型のオブジェクトを宣言して利用することで当面は凌げそうです。

クラスExB内でクラスExA内のメンバ関数を使いたかったらやはりそうするしかないですか?

Re: 別ファイルのメンバ・オブジェクトの利用に関して

Posted: 2014年7月09日(水) 14:00
by YuO
てろっぷ さんが書きました:クラスExBにおいて必ずしもobjAの値を使わなければならなかったわけではないので、
ExB.cpp内で新たにExA型のオブジェクトを宣言して利用することで当面は凌げそうです。
そもそも,ExA型のオブジェクトをさらに用意する,というので本当によいのですか。
それは元のExA型のオブジェクトとは別のインスタンスですから,当然元とは別の状態を保持することになります。
それは,やりたいことと違うのではないでしょうか。

まず,ExB::funcBがExAを必要とするのだから,

コード:

void funcB (const ExA &) const;
のように,ExA型のオブジェクトのインスタンスを受け取るようにして,
そのインスタンスに対してExA::funAを呼び出すようにするのがよいと思います。

また,ExA::dataAをExA::funcAの引数にしているのは違和感があります。
ExA::dataAがそもそもExAの状態でない (=ExAのメンバではない) か,ExA::funcAは引数を取らず必ずdataAにアクセスする,のどちらかが自然だと思います。

Re: 別ファイルのメンバ・オブジェクトの利用に関して

Posted: 2014年7月09日(水) 14:28
by てろっぷ
おお、出来ました!
確かに別のオブジェクトを生成しては何も解決しないし、またデータメンバを引数にとる必要もありませんでしたね。
そういう初歩的なミスを犯してしまったのはやはりプログラミングの経験が少ないからだと痛感しました...
usaoさん、YuOさん、ご教授頂きありがとうございました。