ちくのう症(蓄膿症)は「菌」が原因!?

ある処理をするクラスAとログ出力のような動作をするクラスBがあります。
Bクラスはメイン処理及びメインから呼ばれたクラスA両方から呼ばれます。

メイン処理にて、Bクラスのコンストラクタで出力ファイルのパスを指定し
その情報をメインから呼ばれたAクラスの中で呼ばれるBでも使用したいと思っています。
クラスを引数として渡せば可能かもしれませんが、できればその方法は使いたくありません。
何か良い方法はありませんでしょうか?

void main()
{
B clsB("c:\\aaa.txt")

A clsA;
clsA.fnc();
}

A::fnc()
{
clsB.output();
}

//Class B.h ---------
class B {
private:
char path[256];
public:

B(char *buff);
int fnc();
};

//Class B.cpp ---------
B::B(char *buff)
{
strcpy(path, buff);
}
B::output()
{
fp = fopen(path, "a");
・・・
}

A 回答 (3件)

ポインタや参照として、引数として渡すのはスタンダードな方法ですが


その場合でも、渡す回数や関数呼び出し回数等は最小限で済むように、カプセル化を十分強めておくことが
大変有効です。


それを踏まえたうえで、別の方法も色々とあります。


方法1.

B clsB("c:\\aaa.txt")

A clsA;

この順番で確実に作るのでしたら、こういうのも考えられます。

class B; //前方宣言

class A {
const B* const b; //ポインタ(や参照)を持たせる
public:
A( const B* b_ ) : b(b_) {}
void fnc() const;
};

//ソース

void A::fnc() const { b->output(); }





方法2.
もしAとBが意味的に十分強い関係性を持ち、セットに出来るようなケースでは、方法1のように別々に作ってからポインタを受け渡したりせずに、AがBの生成と破棄を管理してもいいでしょう。




方法3.

Bがログ出力専用のようなクラスで、一つだけなど、特定の個数あれば十分な場合
自分自身にstaticな方法でインスタンスを管理させて、どこからでもstatic関数で呼び出せるようにする
といった方法も考えられます。

class B {

static B* b; //生成されるインスタンス格納用

char path[256];

B( const char* ); //コンストラクタを始め、staticでないメンバはすべてprivateでもOK
void output() const;

public:

static void Init( const char* c ){ b = new B(c); }
static void Cleanup(){ delete b; b = NULL; }

static void output_S(){ if (b) b->output(); }

};

あとはソースに

B* B::b( NULL );

とでも書いておきます。


これで、最初の方に
B clsB("c:\\aaa.txt")


のかわりに
B::Init( "c:\\aaa.txt" );
としておき

後は引数として渡さなくてもどこからでも
B::output_S();
だけで呼び出せます。

そして終了前に解放します。
B::Cleanup();


方法4.

とりあえず、引数でやるけど
クラス数がB,C,D…と増えるといった場合


別に構造体等を作っておいて、それだけいじれば済んでしまう、という形にしてしまうのもいいでしょう。



class B;
class C;

class A {
public:

void ABC( const B&, const C& );
void ABC2( const B&, const C& );
void ABC3( const B&, const C& );

};

ここにDを単純に加える場合

class B;
class C;
class D;

class A {
public:

void ABC( const B&, const C&, const D& );
void ABC2( const B&, const C&, const D& );
void ABC3( const B&, const C&, const D& );

};


こうなってしまう、というのであれば

stuct DATA {
const B* b;
const C* c;
};

とかを別途作っといて

struct DATA;

class A {
public:

void ABC( const DATA& );
void ABC2( const DATA& );
void ABC3( const DATA& );

};

などとしておくことで、このDATA構造体を書き変えるだけで

stuct DATA {
const B* b;
const C* c;
};



stuct DATA {
const B* b;
const C* c;
const D* d;
};

同様の効果が得られます。
    • good
    • 0

おそらくは、クラスを使うべきではないところで無理やりクラスを使おうとしています。


クラスというのは、たんなる関数の寄せ集めではなくて、ある程度の自律性を持った機能の集合です。
で、一番自然な使い方は、複数のインスタンスを生成して、それぞれのインスタンスごとの振る舞いを行わせるということです。

だから、ログをとるというクラスがあれば、いろいろなログを独立してとる(それぞれに独立したインスタンスが存在する)のであれば、有効です。
一方で、一連のログ(早い話が、ログファイルファイっこしかない)をあちこちで収集するなら、「一連のログをとる」関数郡をひとまとめにすれば言いいのです。

C++には、namespace という機能があって、そういう用途にも使えますから、

logFiles::init(char *filePathName); で最初にログファイルを設定して、
logFiles::appendNormal(char *message); で、正常なログを追記して、
logFiles::appendError(char *message); でエラーログを追記して

のようなこともできます。

また、本当に、処理のあちこちで、いろいろなログをとりたいのなら、「このログファイルへの追記」というのがそれぞれ明確でしょうから、「このログファイル」を指定するために、クラスのインスタンスを渡すべきです(というか、インスタンスを渡すのではなくて、「該当するログを担当しているインスタンスに、ログをとるようにメッセージを送信する」という考え方が、正解)
    • good
    • 0

普通は「クラス (のインスタンス) を引数として渡す」ものなんだけど....



むしろ, どうして「その方法は使いたくありません」と思ったのでしょうか?

この回答への補足

Tacosanさん回答ありがとうございます。

>どうして「その方法は使いたくありません」と思ったのでしょうか?

あくまで予定ではあるのですが
例えばクラスAの複数の関数で呼ぶなどとなった場合や
クラスCが追加になった場合など、すべてに引数として渡すのは
どうかなと思ったので、ほかの方法があるならそっちの方がいいのかな
と考えたからです。
(そもそもコンストラクタなどでファイルパスを指定するのが正しいのか
よくわかっていないこともありますが・・・)

補足日時:2011/12/19 14:55
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qクラス間の変数について

よろしくお願いします。

VC++のウィザードが自動生成するChildFrm.cpp内のクラスAとMainFrm.cpp内のクラスBの間で共通の変数int xxxを使いたいのですが、どこに宣言すれば良いのでしょうか?

それともクラス間では、そのようなことは出来ないのでしょうか?

ご存知の方教えてください。

Aベストアンサー

// M.h
class M {
private:
int xxx;
public:
void setXXX(int v) { xxx = v; }
int getXXX() const { return xxx; }
...
};

// C.cpp
#include "M.h"
#include "C.h"

void C::function() {
M* m = static_cast<M*>(GetParentFrame());
m->setXXX(123); // write
int xxx = mf->getXXX(); // read
}

Q複数クラスで共通の関数、変数の呼び出し方

お世話になります。
質問させて頂きたいことは
複数のクラスで共通して使われる関数、変数があった場合、その関数、変数は私の中で次の2通りの方法が思い当たったのですがどちらのほうがメモリ等の使用からよいのでしょうか?
1つめは
あるヘッダファイル****.hを作成し、その中で関数を宣言し、変数はそのヘッダファイルのソースファイル中のグローバル変数とする。
2つめは
クラスを作成し、静的メンバ関数、静的メンバ変数とする。

ネット等で拝見すると、あまりグローバル変数というのはよく見られていないようなので2つめの方がいいのかなと思っているのですが、静的メンバを今まで使ったことがないので、このような用途に使われるべきなのかも正直わかっていません。

検討外れのことを言っているのかもしれませんが、教えて頂ければと思っております。宜しくお願い致します。

Aベストアンサー

本当に共通して使われる関数があるなら単なるC言語的な関数で良いと思いますのでクラス化する必要は有りません。ただし、データ保持する変数と組になる関数であるならばクラス化を考えてください。
例えば日付を処理する関数と日付を保持する変数があるなら、それは1つのオブジェクトで1つのクラスとすべきです。

>ネット等で拝見すると、あまりグローバル変数というのはよく見られていないようなので2つめの方がいいのかなと思っているのですが、

安易なグローバル変数を避けることはコードの見通しやバグの削減につながるので良いことですが、むやみにグローバル変数をやめて逆に複雑になるなら避けたほうが良いです。

と言うことで私の答えは1でも2でも無い3です。
変数と関数を組とした1つのクラスとして、そのクラスのインスタンスをグローバル変数として宣言してください。

Q複数のクラスで共通した関数を使いたい場合

C++なのですが、複数のクラスで共通して使いたい関数がある場合、親クラスに共通したい
メンバ関数を作り、その子として複数のクラスを作るのが良いのでしょうか?

それ以外の方法だとクラスの外でstatic宣言した関数であればクラス内で使えるようでした。
(static宣言しないとコンパイルエラーとなりました)

しかし以下のサイトにあるように「共通関数継承のデメリット」があるようで推奨していないようです。

ttp://d.hatena.ne.jp/katzchang/20110216/p1
ttp://blog.jnito.com/entry/20110217/1297896355

なお、自分には上記サイトの内容は難しくて理解できませんでした。
つまり、「数のクラスで共通して使いたい関数がある」場合、上記サイトはどうすればいいと言っているのでしょうか?

よろしくお願い致します。

Aベストアンサー

C++で「入れ子クラス(クラスの中に別のクラスを作ること)」は、可能ですが、私は使ったことがないです。

で、static の有無と、「クラスの中にクラスを作ったから」というのは、直接的な意味では関係ないです。
クラスの中にある(static でない)関数は、「メンバ関数」と呼ばれます。
これは、「クラスによって生成されたインスタンス」にバインドされた関数です。

例えば、
class A()
{
void a();
};

という場合、
A val; と、インスタンス(ここでは、val)を定義して、

val.a();

というけいろでしか呼び出すことはできません。
これは、val という「インスタンスに対して」何かせよといっているので、インスタンスが指定されないと「誰に?」ということになります。
だから、「別のクラスから呼び出している」つもりで、A::a() という呼び出しはできないわけです。

一方、static メンバ関数は、インスタンスにバインドされない関数です。

class A()
{
static b();
};

という場合、(アクセう制御が間違ってなければ) A::b() という呼び出しができます。
ただし、文法上は可能ですが、本来は、class A のことを司る関数であるべき(A のメンバですから)で、Aと関係なく関数を集めるという用途で使用するべきではありまん。

本当に、「自分だけが使う」関数であれば、それが小さなものなら、main と同じファイルの中で、単純に書けば済むことです。

main.cpp
----------------

int my_func_add(int a, int b)
{
int wk = a + b;
return wk;
}

int my_func_sub(int a, int b)
{
int wk = a - b;
return wk;
}

int main()
{
// いろいろな処理
int c = my_func_add(1, 2);
int d = my_func_sub(c, 2);

}

こんな感じ。

もう少し増えれば、

my_fun.h というファイルに
int my_func_add(int a, int b);
int my_func_sub(int a, int b);

として、

my_func.cpp に実体を書いて

#include "my_func.h"

int my_func_add(int a, int b)
{
int wk = a + b;
return wk;
}

int my_func_sub(int a, int b)
{
int wk = a - b;
return wk;
}

main.cpp で

#include "my_func.h"
int main()
{
// いろいろな処理
int c = my_func_add(1, 2);
int d = my_func_sub(c, 2);

}

などとすればいいです。

C++で「入れ子クラス(クラスの中に別のクラスを作ること)」は、可能ですが、私は使ったことがないです。

で、static の有無と、「クラスの中にクラスを作ったから」というのは、直接的な意味では関係ないです。
クラスの中にある(static でない)関数は、「メンバ関数」と呼ばれます。
これは、「クラスによって生成されたインスタンス」にバインドされた関数です。

例えば、
class A()
{
void a();
};

という場合、
A val; と、インスタンス(ここでは、val)を定義して、

val.a();

というけいろでしか...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

QCStringからchar*への型変換について教えてください。

以前の質問に

int型 → CString型/char型

がありましたが、

CString型をchar*型に変換する方法を
教えていただければありがたいです。

MSDNで「LPCTSTRキャスト」が説明されていましたが、
例が載ってないのでよくわかりませんでした。

よろしくお願いします。

Aベストアンサー

目的にもよりますが一時的にchar配列として使いたいならCString::GetBuffer()が利用できます。
char配列としての利用が終わったらCString::ReleaseBuffer()する必要がありますが。

直接CString内の文字列を扱う必要があるならCString::operator LPCTSTRで文字列ポインタが得られます。
ただし、CStringオブジェクトをいじると無効ポインタなる可能性があるので気をつけてください。

MSDNのMicrosoft Foundation Classリファレンス→CString→クラスメンバで確認してください。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qc++,ある関数のクラスから別のクラスの関数を呼ぶ

c++で、あるクラスのメンバ関数から、別のクラスのメンバ関すを呼びたいのですが、どのようにしたらできますか?
例えば、以下のような単純なコードを考えています。やりたいことは、Aのメンバ関数であるaaa()からBのクラスであるbbb()を呼びたいと思っています。その理由を少し説明します。ここでは、Aというクラスとmain関数はオープンソースコードを例えています。できるだけ、元のオープンソースコードを書き換えずに新たな機能を拡張したいと思っています。そこで、Bというクラスを使って、元のオープンソースコードに機能を拡張しようとしています。このような理由なので、bbb()という関数はaaa()という関数から呼びたいです。メイン関数には何も書き加えないのがベストです。
現状では、実行すると「this is aaa」という出力しか出ません。ここに「this is bbb」の出力を加えたいです。クラスAとBにある程度コマンドを追加して、解決できないでしょうか。

#include <iostream>
using namespace std;

//------------------------------------------------------
class A{
public:
void aaa();
virtual void bbb(){}
};
//------------------------------------------------------

//------------------------------------------------------
class B : public A{
public:
void bbb();
};
//------------------------------------------------------

//------------------------------------------------------
void A::aaa()
{
cout << "this is aaa \n";
bbb();
}
//------------------------------------------------------

//------------------------------------------------------
void B::bbb()
{
cout << "this is bbb \n";
}
//------------------------------------------------------

//------------------------------------------------------
int main()
{
A a;
a.aaa();
return 0;
}
//------------------------------------------------------

c++で、あるクラスのメンバ関数から、別のクラスのメンバ関すを呼びたいのですが、どのようにしたらできますか?
例えば、以下のような単純なコードを考えています。やりたいことは、Aのメンバ関数であるaaa()からBのクラスであるbbb()を呼びたいと思っています。その理由を少し説明します。ここでは、Aというクラスとmain関数はオープンソースコードを例えています。できるだけ、元のオープンソースコードを書き換えずに新たな機能を拡張したいと思っています。そこで、Bというクラスを使って、元のオープンソー...続きを読む

Aベストアンサー

Aを極力触りたくないのであれば、あまりカッコよくありませんが、AがBを継承するではどうでしょうか?
提示コードを以下のように書き換えれば、とりあえず期待する動きはすると思います。

//------------------------------------------------------
class B {
public:
virtualvoid bbb();
};
//------------------------------------------------------

//------------------------------------------------------
class A: public B{
public:
void aaa();
};
//------------------------------------------------------
※ その他はそのまま

Qクラスがメンバーとしてクラスを持つ時の宣言について

自作クラスMainClassがMyClassというクラスをメンバー変数として持つ場合、宣言時に引数をいくつか持つコンストラクタを呼び出そうとすると構文エラーとなります。

class MyClass
{
public:
MyClass(int, int);
}

class MainClass
{
private:
MyClass myclass(10,10);
}


このような宣言はできないのでしょうか。
引数なしのコンストラクタは呼び出せているようです。

Aベストアンサー

クラス定義内でメンバの初期化は出来ません。
例外として static constの整数型メンバのみ初期化が認められていますが。

>引数なしのコンストラクタは呼び出せているようです。
勘違いです。
MyClassのコンストラクタが呼び出されるのはMainClassのコンストラクタ内です。

//MainClassのクラス定義
class MainClass
{
private:
 MyClass myclass;
//…
};

//MainClassのコンストラクタ定義
MainClass::MainClass() : myclass(10,10)
{
//…
}

初期設定リスト「:myclass(10,10)」を指定しなければMyClassのデフォルトコンストラクタが暗黙に呼び出されます。

なお、MyClassのコンストラクタで引数に初期値を指定しておく手もあります。

MyClass {
public:
 MyClass(int=10, int=10);
//…
};

この場合、MainClassのコンストラクタでmyclassの初期設定リストを省略しても所期の結果が得られます。
しかし、初期値を設定した場合でも初期設定を明示することをお勧めしますが。

クラス定義内でメンバの初期化は出来ません。
例外として static constの整数型メンバのみ初期化が認められていますが。

>引数なしのコンストラクタは呼び出せているようです。
勘違いです。
MyClassのコンストラクタが呼び出されるのはMainClassのコンストラクタ内です。

//MainClassのクラス定義
class MainClass
{
private:
 MyClass myclass;
//…
};

//MainClassのコンストラクタ定義
MainClass::MainClass() : myclass(10,10)
{
//…
}

初期設定リスト「:myclass(10,10)」を指定し...続きを読む

Q構造体を引数とする、クラス間のデータの受渡し方法について

現在、C++の構造体を理解しようと努めていますが、どうしても理解できない点があり、
なにとぞ、ご指導・ご助言のほどよろしくお願い致します。

1.質問内容
 a.構造体を引数とする、クラス間のデータの受渡し方法について
・主プロ(主クラス)側の構造体のメンバ変数を、サブプロ(サブクラス)側で更新するのに、
メンバ変数を一つずつ引数として渡せば、正しく更新できるのですが、構造体を引数として渡すと
   コンパイルエラーになります。
  ・どのように定義すれ場良いのかをご助言お願い致します。
2.プログラムの内容を簡単に記載します。
 全部を記載する事は出来ないので、一部を省略して簡単に必要な所だけを記載します。
 a.Main.cpp
int main()
{
CMain main;
CSub sub;

//Main_Classの関数に、Sub_Classクラスのポインタを引数として渡し、Sub_Classクラスの関数を呼び出す
main.Main_FuncCall(&sub);

return 0;
}

b.CMain_Class.h
class CMain
{
public:
//コンストラクタ
省略
//デストラクタ
省略

typedef struct CHAR1
{
int m_chx;
int m_chy;
bool m_chValidFlag;
};
CHAR1 *pc;

//データの受け渡し(ポインタ)
void Main_FuncCall( CSub* cs );
};

 c.CMain_Class.cpp
void CMain::Main_FuncCall( CSub* cs )
{
//メインクラスの構造体を引数として、サブクラスの関数を呼び出す
//サブプロ側の構造体を更新する
cs->Sub_FuncCall4( pc );
}

d.CSub_Class.h
class CSub
{
public:
//コンストラクタ
省略
//デストラクタ
省略

typedef struct CHAR_S
{
int m_chx;
int m_chy;
bool m_chValidFlag;
};
CHAR_S *ps;

void Sub_FuncCall( CHAR_S *pc );
};

e.CSub_Class.cpp
void CSub::Sub_FuncCall( CHAR_S *pc )
{
pc[1].m_chx += ps[1].m_chx;
}

3.コンパイルする
 a. cs->Sub_FuncCall4( pc ); -> 1 番目の引数を 'struct CMain::CHAR1 *' から 'struct CSub::CHAR_S *'
に変換できません。 (新しい機能 ; ヘルプを参照) 指示された型は関連がありません; 変換には
reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
b.色々と試してみましたが、現在の私の知識ではコンパイルができません。
  アドバイスのほど、よろしくお願いします。

現在、C++の構造体を理解しようと努めていますが、どうしても理解できない点があり、
なにとぞ、ご指導・ご助言のほどよろしくお願い致します。

1.質問内容
 a.構造体を引数とする、クラス間のデータの受渡し方法について
・主プロ(主クラス)側の構造体のメンバ変数を、サブプロ(サブクラス)側で更新するのに、
メンバ変数を一つずつ引数として渡せば、正しく更新できるのですが、構造体を引数として渡すと
   コンパイルエラーになります。
  ・どのように定義すれ場良いのかをご助言お願...続きを読む

Aベストアンサー

CMain,CSub共通の構造体宣言が必要なら 構造体をグローバルに定義する方法が一般的かと思います

CMain,CSubで共通のヘッダーを用意してそこに構造体を定義しましょう

--- Common.H
typedef struct CommonCHAR {
  int m_chx;
  int m_chy;
  bool m_chValidFlag;
}COMMONCHAR, *LPCOMMONCHAR;
としておいて CMain_Class.HやCSub_Class.Hから構造体の定義をはずします
各ヘッダの冒頭で
#include "Common.h"
を記述します

CMain,CSubの変数宣言または仮引数宣言を
CommonCHARで記述しましょう


人気Q&Aランキング