dポイントプレゼントキャンペーン実施中!

前回させてもらった解決済み質問の続きです。
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")){
//コンストラクタの内容
}

しかしこれには問題があり、ファイルの数が増えれば増えるほど、コードの数も増えうまいコードの書き方とはいえず、多少面倒です。
メンバイニシャライザは使わず、ほかに効率の良い一つの配列を使った定義の仕方はありますでしょうか。

質問者からの補足コメント

  • どう思う?

    kmeeさんご回答ありがとうございます。
    順を追ってprivateでconstでないメンバを用意して、初期化用メソッドを用意して任意のタイミングで初期化できるようにしようとしていますが、できません。
    C2440 '=': 'initializer list' から 'int' に変換できません。
    というエラーを吐きます。

    具体的なコードを教えていただけるとうれしいです。

      補足日時:2016/03/13 02:27
  • Tacosanさん
    まさにその通りに書きました。

    ネットの記事を見てその通りに書き、間違いはないと思ったのですがどうなのでしょう。

    具体的なコードを教えてもらえると嬉しいです。

      補足日時:2016/03/13 03:25

A 回答 (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 (なりなんなり) でまわすとか.
    • good
    • 1
この回答へのお礼

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

ttp://d.akiroom.com/2012-07/cpp-static-member-variable-array-initialize/
このサイトに記事がありました。

なるほど。
無事解決できました。

ファイル名を配列でもっておいてforで回すのは、またじっくり試してみたいと思います。

お礼日時:2016/03/14 14:40

その「エラーを吐く」コードって, どんなコードなんでしょうか? まさか


ccc[8] = {Loadgraph("ファイル名1"),・・・,Loadgraph("ファイル名8")};
なんて書いてないですよね?
    • good
    • 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ではないメンバーですから、主旨が異なります。
    • good
    • 1
この回答へのお礼

よくわかる御指南ありがとうございます。

お礼日時:2016/03/14 15:26

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