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

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

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

#1

投稿記事 by てろっぷ » 11年前

まず何をしたいのか書きます。

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
[tab=30]プログラミングって難しいですね…

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

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

#2

投稿記事 by usao » 11年前

extern とさえ書けば
変数が 「どこにあっても 唐突に 好き勝手に いじくれる」というわけではありません.

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

てろっぷ
記事: 9
登録日時: 11年前

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

#3

投稿記事 by てろっぷ » 11年前

クラスExBにおいて必ずしもobjAの値を使わなければならなかったわけではないので、
ExB.cpp内で新たにExA型のオブジェクトを宣言して利用することで当面は凌げそうです。

クラスExB内でクラスExA内のメンバ関数を使いたかったらやはりそうするしかないですか?
[tab=30]プログラミングって難しいですね…

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

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

#4

投稿記事 by YuO » 11年前

てろっぷ さんが書きました:クラス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にアクセスする,のどちらかが自然だと思います。

てろっぷ
記事: 9
登録日時: 11年前

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

#5

投稿記事 by てろっぷ » 11年前

おお、出来ました!
確かに別のオブジェクトを生成しては何も解決しないし、またデータメンバを引数にとる必要もありませんでしたね。
そういう初歩的なミスを犯してしまったのはやはりプログラミングの経験が少ないからだと痛感しました...
usaoさん、YuOさん、ご教授頂きありがとうございました。
[tab=30]プログラミングって難しいですね…

閉鎖

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