プロが教えるわが家の防犯対策術!

a.h
クラスの定義
a.cpp
クラスのメンバ関数の定義

b.h
#include "a.h"
クラスの定義
b.cpp
クラスのメンバ関数の定義

----c.cpp----
#include "a.h"
#include "b.h"

a.hで定義したクラスの宣言
b.hで定義したクラスの宣言

メインの処理

-----------------------------------------
b.cppで定義しているクラスのメンバ関数にて
a.cppで定義したクラスのメンバ変数にアクセスしたいのです。

どうするのが一番良いのでしょうか?

a.cppにメンバ変数を返すだけの関数を定義してb.cppでc.cppで宣言したa.hのクラスを
extern宣言してみたのですがエラーが出てコンパイルが通らないです。

A 回答 (6件)

>extern宣言ではダメだということでしょうか?



externはグローバル変数やグローバル関数に対して使うものです。

どこかにあるグローバル変数でないものを強制的にグローバル変数として扱うためのものではありません。
    • good
    • 0
この回答へのお礼

extern宣言の勉強をし直しました。

本当にありがとうございます。

お礼日時:2014/07/21 22:41

character.cppの



>extern Node_Access Node;

は、実体はどのファイルに定義してあるのか確認してください。
もし、main.cppの関数WinMain中にある

>Node_Access Node;

のつもりなら変数のスコープをよく考えてください。

この回答への補足

winmain内のみでしかNode_Access Node は有効で無いということですか?

extern宣言ではダメだということでしょうか?

補足日時:2014/07/21 20:06
    • good
    • 0

>すいません。

うまく説明出来ずに冗長になってしまいました。

冗長ではなく情報が不足してるといってるんですけど。

>エラーは
>error LNK2001: 外部シンボル ""class Node_Access Node" (?Node@@3VNode_Access@@A)" は未解決です。

#1には「どういったソースを書きましたか」とも書いてると思うんですが。
とりあえず、そのエラーメッセージから思いつくのはソースの分割はしたけどリンク時にまとめることをやってないってとこでは。

この回答への補足

---------main.cpp--------------
#include "DxLib.h"
#include <vector>
#include "path.h"
#include "charcter.h"
using namespace std;
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){

Node_Access Node;
Charcter_Access Ch;
vector<int> path;

DxLib_Init();

Node.Node_init();
Ch.Charcter_init();

path = Node.Node_dijkstra(0,4);

Node.Node_Draw(path);
Ch.Charcter_Draw();

DxLib_End();
return 0;
}

------------path.cpp----------------
#include "DxLib.h"
#include <vector>
#include <fstream>
#include <string>
#include <math.h>
#include <limits.h>

#include "path.h"

using namespace std;

//初期化用の関数の定義
void Node_Access::Node_init(void){
}
//2点のコストを求める
void Node_Access::Get_Distance(void){
}
//座標を指定
void Node_Access::Node_Datain(void){
}
//ノードの描画を定義
void Node_Access::Node_Draw(vector<int> path ){
}
//最短経路をダイクストラ法で導く
vector<int> Node_Access::Node_dijkstra(int s,int e){
}
//ノードのx座標を返す。
int Node_Access::ReNode_x(int Num){
return Node[Num].x;
}
//ノードのy座標を返す。
int Node_Access::ReNode_y(int Num){
return Node[Num].y;
}
//ノードの総数を返す。
int Node_Access::ReNode_Num(void){
return Node.size();
}
-------path.h-----------------
#ifndef _PATH
#define _PATH

#include <vector>

using namespace std;

typedef struct _NODE{
}NODE_t;
typedef struct _MINNODE{
}MINNODE_t;

class Node_Access{
private:
vector<NODE_t> Node;
MINNODE_t min;
public:
void Node_init(); //初期化用関数宣言
void Node_Datain();//ノードに座標を指定
void Node_Draw(vector<int> path); //ノードの描画宣言
vector<int> Node_dijkstra(int s,int e);
void Get_Distance();//2点間の距離を求める
int ReNode_x(int Num);//x座標を返す
int ReNode_y(int Num);//y座標を返す
int ReNode_Num(); //ノードの総数を返す。
};
#endif

----charcter.cpp--------
#include "charcter.h"

#define CNUM 3

extern Node_Access Node;

//キャラクター初期化用関数の定義
void Charcter_Access::Charcter_init(void){
ここでNode の総数を返す関数を使いたいです。
}
//キャラクター描画用関数定義
void Charcter_Access::Charcter_Draw(void){
}

---------charcter.h------------
#ifndef _CHARCTER
#define _CHARCTER

#include <vector>
#include "DxLib.h"
#include <time.h>

#include "path.h"

using namespace std;

typedef struct _CHARCTER{
int x,y; //キャラ座標
int NowNode; //現在いるノード位置
int GoalNode; //目的のノード
vector<int> root; //ルートを格納
}CHARCTER_t;

class Charcter_Access{
private:
vector<CHARCTER_t> Ch;
public:
void Charcter_init(); //初期化用
void Charcter_Draw(); //描画用
};

#endif

補足日時:2014/07/21 17:13
    • good
    • 0

具体的にどんなエラーですか?



----c.cpp----
#include "a.h"
#include "b.h"
で、 b.h の中にも #include "a.h" があるので、二重定義になってしまっている、というのが一番ありそうですが。
    • good
    • 0

b.cppでa.hをincludeするだけの話じゃないでしょうか?

    • good
    • 0

>a.cppにメンバ変数を返すだけの関数を定義してb.cppでc.cppで宣言したa.hのクラスをextern宣言してみたのですがエラーが出てコンパイルが通らないです。



具体的に、どのようなソースを書いて、どのようなエラーが出たんですか。
丁寧に説明されてるつもりなんでしょうが読み手としては何を書いてるのかわかりません。

この回答への補足

すいません。うまく説明出来ずに冗長になってしまいました。

要するに別のソースに宣言したクラスを扱う方法がわからなのです。

エラーは

error LNK2001: 外部シンボル ""class Node_Access Node" (?Node@@3VNode_Access@@A)" は未解決です。

と出ます。これで調べたのですが良くわからず解決に至ってないです。

補足日時:2014/07/21 12:35
    • good
    • 0

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