質問するログイン新規登録
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

8584閲覧

ヘッダファイル内での配列の初期化について(C++)

hashimon

総合スコア18

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/06/23 02:36

0

0

ヘッダファイル内での配列の初期化について(C++)

以下のようにヘッダファイル(Topology.hpp)を作成しました.
クラス内でネットワークの隣接情報を格納する二次元配列Network[][]を定義し,その後配列の各値に,ノード間の距離を代入(Network[0][1]=593.3 ...)して初期化しようとしました.

しかし結果として値の代入部分の処理で以下のようなエラーが発生してしまいました.

この宣言にはストレージクラスまたは型指定子がありません.

ヘッダファイル内でこのように"配列に値を代入する"といった処理を行うことはそもそもできないのでしょうか.
最終的には,ヘッダファイル内でNetwork[][]の値を初期化し,それを外部のc++ファイルでインクルードすることによって,そのc++ファイル内からNetwork[][]にアクセスできるようにしたいと思っております.
おとなしくコンストラクタ内で値を代入する方が得策でしょうか.
よろしくお願いいたします.

c++

1#ifndef _TOPOLOGY_H 2#define _TOPOLOGY_H 3 4class CTopology { 5public: 6 CTopology() { ctor(); } //!< コンストラクタ 7 ~CTopology() { dtor(); } //!< デストラクタ 8 9 double Network[12][12] = {}; 10 11 //JPN12 12 Network[0][1] = 593.3; 13 Network[0][3] = 1256.4; 14 Network[1][2] = 351.8; 15 Network[2][3] = 47.4; 16 Network[2][6] = 366; 17 Network[3][5] = 250.7; 18 Network[5][4] = 252.2; 19 Network[5][6] = 250.8; 20 Network[6][7] = 186.6; 21 Network[4][7] = 263.8; 22 Network[6][9] = 490.7; 23 Network[7][8] = 341.6; 24 Network[8][9] = 66.2; 25 Network[8][10] = 280.7; 26 Network[9][11] = 1158.7; 27 Network[9][10] = 365; 28 Network[10][11] = 911.9; 29 Network[1][0] = 593.3; 30 Network[3][0] = 1256.4; 31 Network[2][1] = 351.8; 32 Network[3][2] = 47.4; 33 Network[6][2] = 366; 34 Network[5][3] = 250.7; 35 Network[4][5] = 252.2; 36 Network[6][5] = 250.8; 37 Network[7][6] = 186.6; 38 Network[7][4] = 263.8; 39 Network[9][6] = 490.7; 40 Network[8][7] = 341.6; 41 Network[9][8] = 66.2; 42 Network[10][8] = 280.7; 43 Network[11][9] = 1158.7; 44 Network[10][9] = 365; 45 Network[11][10] = 911.9; 46 47private: 48 virtual void ctor(void); //!< コンストラクタ処理 49 virtual void dtor(void); //!< デストラクタ処理 50 51}; 52 53#endif // _Topology_H

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

代入はできませんが初期化はできますので、こんな方法もあります。

c++

1#ifndef _TOPOLOGY_H 2#define _TOPOLOGY_H 3 4class CTopology { 5public: 6 CTopology() { ctor(); } //!< コンストラクタ 7 ~CTopology() { dtor(); } //!< デストラクタ 8 9 double Network[12][12] = { 10 { 0, 593.3, 0, 1256.4 }, //[0] 11 { 0, 0, 351.8 }, //[1] 12 { 0, 0, 0, 47.4, 0, 0, 366}, //[2] 13 }; 14 //JPN12 15 //Network[0][1] = 593.3; 16 //Network[0][3] = 1256.4; 17 //Network[1][2] = 351.8; 18 //Network[2][3] = 47.4; 19 //Network[2][6] = 366; 20 //Network[3][5] = 250.7; 21 //Network[5][4] = 252.2; 22 //Network[5][6] = 250.8; 23 //Network[6][7] = 186.6; 24 //Network[4][7] = 263.8; 25 //Network[6][9] = 490.7; 26 //Network[7][8] = 341.6; 27 //Network[8][9] = 66.2; 28 //Network[8][10] = 280.7; 29 //Network[9][11] = 1158.7; 30 //Network[9][10] = 365; 31 //Network[10][11] = 911.9; 32 //Network[1][0] = 593.3; 33 //Network[3][0] = 1256.4; 34 //Network[2][1] = 351.8; 35 //Network[3][2] = 47.4; 36 //Network[6][2] = 366; 37 //Network[5][3] = 250.7; 38 //Network[4][5] = 252.2; 39 //Network[6][5] = 250.8; 40 //Network[7][6] = 186.6; 41 //Network[7][4] = 263.8; 42 //Network[9][6] = 490.7; 43 //Network[8][7] = 341.6; 44 //Network[9][8] = 66.2; 45 //Network[10][8] = 280.7; 46 //Network[11][9] = 1158.7; 47 //Network[10][9] = 365; 48 //Network[11][10] = 911.9; 49 50private: 51 virtual void ctor(void); //!< コンストラクタ処理 52 virtual void dtor(void); //!< デストラクタ処理 53 54}; 55 56#endif // _Topology_H

投稿2019/06/23 04:18

Bull

総合スコア986

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

初期化式と代入文は区別する必要があります
初期化式は変数の宣言時に書けますが、代入文はメソッド/関数の中で実行させるもんです

投稿2019/06/23 03:12

y_waiwai

総合スコア88180

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんにちは。

クラスの中に直接実行文はかけません。(C++はそのような言語です。)
ctor()関数の中にかけば良いはずです。
どうしてもヘッダで初期化したいなら、ctor()関数をヘッダ内で定義すれば良いです。

投稿2019/06/23 03:00

Chironian

総合スコア23274

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

値を与えること自体は解決しているようなので余談になっちゃいますが。

「ヘッダファイル」というファイルに厳密な定義はありません...
複数ソースで共通になるマクロや宣言等を括りだして、必要なファイルで読み込む(展開する)ようにしたものがヘッダというだけなので、本質的にソース本体に記述する場合となにかが違うということはありません。
#include <ファイル>あるいは#include "ファイル" とすると、コンパイル時に前処理(プリプロセス)として指定されたファイルをソース上その場所に展開する、という動作をします(いろいろ拡張はありますけれど)。

今回の件を「ヘッダファイル」と関連付けているとどこかで痛い目を見たりしないかとちょっと心配です。

極論、

C++

1//file main.cpp 2#include <iostream> 3#include "main_cxx" 4#include "hello_cxx" 5#include "end_cxx"
//file main_cxx int main(){
//file hello_cxx std::cout << "Hello world" << std::endl;
//file end_cxx return 0; }

としてmain.cppをコンパイルすればHello worldできちゃうわけで。これで行くとヘッダファイルって何? でしょ。

投稿2019/06/23 10:18

thkana

総合スコア7739

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なんとなくですが、代入をコンストラクタ内( もしくはコンストラクタが呼び出すメンバ関数内 ) でやってみてください。

たぶん、書く場所が問題なのでは?

また、OOP的思考では、できるだけ、メンバ変数はprivateで。

投稿2019/06/23 02:59

BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問