教えてください。
1.文字列の配列はどのように宣言すればよいのでしょうか?
char [3][3][20] = {{"朝","昼","晩"},{"morning","evening","night"},{"6:00","12:00","18:00"}};
これでできるとおもうのですが、もっと効率的な宣言ってあるのでしょうか?
2.また、この変数を3つのソースファイルで使用できるグローバル変数にしたいのですが、どのように宣言すればよいのでしょうか?
リンカエラー(外部シンボルが未解決)が発生してしまい、困っています。
def.h(ここで宣言したい)
-----|----
| | |
A.h B.h C.h
| | |
A.cpp B.cpp C.cpp
ちなみにBorland C++ Builder5を使っています。
No.2
- 回答日時:
> 2.また、この変数を3つのソースファイルで使用できるグローバル変数にしたい
グローバル変数にすること自体はお勧めできませんが、やり方だけ。
No.1 の回答でも問題はないんですが、A.cpp ~ C.cpp は、この時刻の定義を
使う、という意味で同じ位置付けですから、A.cpp だけ特別、ってのはあまり
良くないですね。
というわけで、グローバル変数の定義をするソースだけを作ってしまいましょう。
(例えば、)def.h は、
extern const char g_timerange[3][3][20];
def.cpp を作って、
#include "def.h"
const char g_timerange[3][3][20] = {{"朝","昼","晩"},{"morning","evening","night"},{"6:00","12:00","18:00"}};
A.cpp などでは、def.h をインクルードして使います。リンクの際には def.o も
リンクの対象にします。
質問の範囲を多少超えますが、どうしてもグローバル変数にするのであれば、
・値の定義として使うのだから、書き込みができないように const 宣言をつけよう
・名前の衝突を考えて、なるべくユニークになるように冗長度の高い変数名にしよう
というアドバイスを付け加えておきます。
後、蛇足をもうひとつ。
せっかく、C++ なんですから、文字列の配列にするよりも、「時間の定義を知っている
クラス」として実装する方が良い、と思いますよ。
a-kumaさん、いつも丁寧な回答ありがとうございます。
やっぱりグローバル変数は良くないのですね。それをクラス化ですか?
例では非常に少ない文字と量ですが作ろうとしているのは、[100][256][80]位の大きい文字配列です。
A.cpp,B.cpp,C.cppからそれぞれその文字データを取り出そうと考えているのですが、どのようにクラス化をすればよいか教えていただければ幸いです。
宜しくお願いします。
No.3ベストアンサー
- 回答日時:
> どのようにクラス化をすればよいか教えていただければ幸いです
あくまでも一例として読んで下さい。
「定義情報」のように、プログラムの中でインスタンスがひとつで良いものを実装する
やり方に Singleton パターンというのがあります。
例えば、こんな感じ。どんな定義情報か分からないんで、時刻情報を扱うクラスだと
思って名前をつけます。
◆ ヘッダ
class TimeRangeInfo {
private:
TimeRangeInfo();
static TimeRangeInfo* timerangeinfo_g;
public:
static TimeRangeInfo* Instance();
// 定義アクセス用のメソッド
const char* getLabel(int hour, int minute) const;
};
◆ソース
#include "timerangeinfo.h"
TimeRangeInfo* TimeRangeInfo::timerangeinfo_g = NULL;
TimeRangeInfo* TimeRangeInfo::Instance()
{
if (timerangeinfo_g == NULL) {
timerangeinfo_g = new TimeRangeInfo;
}
return timerangeinfo_g;
}
TimeRangeInfo::TimeRangeInfo()
{
// 定義の内容を自分のメンバーに登録する
}
const char* TimeRangeInfo::getLabel(int hour, int minute) const
{
// 自分で持っている定義情報から hour、minute にあたる情報を抜き出す
return 抜き出した値;
}
◆使う人
#include "timerangeinfo.h"
// 16:50 は、どんな区分か?
cout << TimeRangeInfo::Instance()->getLabel(16, 50) << endl;
という感じです。
# コンパイルなんかはしてないけど、勘弁 m(_ _)m
定義情報にアクセスするためのキーが何か存在するでしょうから、それを引数に
した情報取得用のメソッドを必要な分だけ作れば良い。
このクラス内部に、どのように定義情報を持つかは、外部には隠蔽されている
のだから、どんな風にやっても良いですね。例えば、外部変数とするにしても
static な(つまり、extern ではない)スコープにすれば、あまり影響は出ない
ですし。
◆ TimeRangeInfo クラスのソース
#include "timerangeinfo.h"
TimeRangeInfo* TimeRangeInfo::timerangeinfo_g = NULL;
static const char* data[100][256] = {
{"data-1", "data-2", ....
//延々とデータが続く
100×256 のデータのキーが何か想像がつかない(100種類のキーに対して、
データが 256 個もあるの?)のですが、私だったら、hash_map なんかを
使うかなあ。
# でも、TimeRangeInfo クラスの内部に隠蔽されているから、何を使っても
# 後で変更するのは簡単ですよね。
パソコンが調子悪く回答に送れて申し訳ありませんでした。
なるほど、いろいろ勉強になりました。
しかし、C++とはなんておくが深いものなのでしょう。
重ね重ね、ご丁寧にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- PHP カラーミーショップのSmartyでの文字列抜き出し 2 2022/05/06 11:51
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- Excel(エクセル) Excel マクロで For 文のインデックスを先に宣言する理由 7 2022/08/27 00:26
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- その他(プログラミング・Web制作) プログラミングについて(Python) 添付した画像はC言語で簡単に作ったソースで、1つの配列に5つ 3 2022/09/10 19:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2重定義って??
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
ハンドルされていない例外が発...
-
typedef enumの使い方を教えて...
-
visualstudio C# テキストボッ...
-
C言語 宣言した変数になにも代...
-
プログラムの中で別のmainを呼...
-
構造体を引数とする、クラス間...
-
enumについて
-
Arduinoのプログラムについて
-
C++/CLIでネイティブの構造体を...
-
変数の型を定義しなかった場合...
-
C++の(左辺値)参照を参照渡し
-
int void (main)の意味・・・
-
C++のfor文について
-
gccのエラー "initialization d...
-
LNK2019: 未解決の外部シンボル...
-
C言語での方向キー入力判定
-
関数の実体定義にヘッダファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
typedef enumの使い方を教えて...
-
関数の実体定義にヘッダファイ...
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
【#define】 defineで定義した...
-
void func( void )について
-
構造体の要素すべてに対する四...
-
構造体の宣言でエラーが出ます。
-
C++の(左辺値)参照を参照渡し
-
main()とint main(void)の違い
-
intとINTの違いは?
-
DLLでLIBファイルが作成されない
おすすめ情報