![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
前回させてもらった解決済み質問の続きです。
DxlibのLoadgraph()を使ったstatic constメンバ変数(配列)の初期化について、また新たな問題の発生があったため、教えてください。
LoadGraph()関数は画像ファイルをメモリにロードする関数です。
前回と一緒の内容もありますが、多少変えてコードは以下の通りです。
<aaa.h>
class bbb{
public:
bbb(); //初期化用関数(コンストラクタ)
static const int ccc[8]; //定義
};
<aaa.cpp>
#include"DxLib.h"
bbb::bbb(){
// コンストラクタの内容
}
const int bbb::ccc[8] = {Loadgraph("ファイル名1"),・・・,Loadgraph("ファイル名8")};
こうするとLoadGraph()関数で返ってくる値が-1となり、ファイル読み込みが失敗しているようです。
ファイルパスの内容は間違ってないはずです。。。
これに関してはほかの手段があり、ファイル格納用変数をconstだけを付けた単体な変数にし、以下のようにメンバイニシャライザを使って定義すると、きちんと値が格納できます。
<aaa.h>
class bbb{
public:
bbb(); //初期化用関数(コンストラクタ)
const int ccc1;
・
・//8個の個別の変数を宣言
・
const int ccc8;
};
<aaa.cpp>
#include"DxLib.h"
bbb::bbb() :ccc1(LoadGraph("ファイル名1")),・・・,ccc2(LoadGraph("ファイル名8")){
//コンストラクタの内容
}
しかしこれには問題があり、ファイルの数が増えれば増えるほど、コードの数も増えうまいコードの書き方とはいえず、多少面倒です。
メンバイニシャライザは使わず、ほかに効率の良い一つの配列を使った定義の仕方はありますでしょうか。
No.3ベストアンサー
- 回答日時:
「ネットの記事を見てその通りに書き、間違いはないと思った」って, いったいどこにある「記事」なんだろ.
たとえば
#include <iostream>
int main()
{
int x[3];
x[3] = { 1, 2, 3 };
for (int i = 0; i < 3; ++i) {
std::cout << x[i] << std::endl;
}
return 0;
}
ってあったらおかしいと思わない?
というわけで, 素直に
ccc[0] = ....;
ccc[1] = ....;
(以下省略)
って書けばいい.
あるいはファイル名を配列で持っておいて for (なりなんなり) でまわすとか.
Tacosanさん
ご回答ありがとうございます。
ttp://d.akiroom.com/2012-07/cpp-static-member-variable-array-initialize/
このサイトに記事がありました。
なるほど。
無事解決できました。
ファイル名を配列でもっておいてforで回すのは、またじっくり試してみたいと思います。
No.2
- 回答日時:
その「エラーを吐く」コードって, どんなコードなんでしょうか? まさか
ccc[8] = {Loadgraph("ファイル名1"),・・・,Loadgraph("ファイル名8")};
なんて書いてないですよね?
No.1
- 回答日時:
たぶん,DXlibを使う準備ができる前にLoadGraphを実行してしまっています。
よって、確実にDxlib初期化の後にLoadGraphを呼ぶようにすることです。
例えば
○static int bbb::InitCcc などといった、初期化用メソッドを用意して、任意のタイミングで初期化できるようにする
static const int bbb::ccc[] に後から代入はできないので
private(またはprotected等) でconstでないメンバを用意して、 (例: static int bbb::s_ccc[])
その内容にアクセスするconst int なGetterを用意する
(例 public: static const int GetCCC(int index) {return bbb::s_ccc[index];} )
> メンバイニシャライザを使って定義すると
こちらは、staticではないメンバーですから、主旨が異なります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
構造体のextern方法
-
MFC - ダイアログボックスのPic...
-
define で 配列
-
Cのエラー
-
C言語の配列のコピーについて質...
-
MFCのCArrayを使った二次元配列
-
C言語の穴埋め問題です
-
C言語から質問です。
-
コンボボックスでデフォルト値...
-
IPアドレスを配列に代入する方法。
-
fclose()でセグメンテーション違反
-
配列の要素数に変数を入れたい...
-
VBのByte配列をVARIANTに格納し...
-
DxlibのLoadgraph()を使ったsta...
-
関数が呼び出されるごとに文字...
-
RAW画像高速表示について
-
char*を初期化したいのですが
-
System.IO.Directory.GetFiles...
-
VBAのプログラムで、DIAG = 1# ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
c言語
-
c言語プログラミング 等差数列...
-
define で 配列
-
構造体のextern方法
-
C#で構造体の配列を持った構造...
-
C言語において、 配列要素をひ...
-
MFC - ダイアログボックスのPic...
-
C言語の2次元配列 容量が大き...
-
2次元配列のマスを数える方法...
-
C言語 ファイルの指定された行...
-
Cのエラー
-
コンボボックスでデフォルト値...
-
C#で配列が空かを判定するには?
-
C#でのフィボナッチ数列
-
ポインタを使って構造体の配列...
-
C言語の課題が出たのですが自力...
-
MFCのCArrayを使った二次元配列
-
C言語の配列のコピーについて
おすすめ情報
kmeeさんご回答ありがとうございます。
順を追ってprivateでconstでないメンバを用意して、初期化用メソッドを用意して任意のタイミングで初期化できるようにしようとしていますが、できません。
C2440 '=': 'initializer list' から 'int' に変換できません。
というエラーを吐きます。
具体的なコードを教えていただけるとうれしいです。
Tacosanさん
まさにその通りに書きました。
ネットの記事を見てその通りに書き、間違いはないと思ったのですがどうなのでしょう。
具体的なコードを教えてもらえると嬉しいです。