質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

C++

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

Q&A

解決済

2回答

3931閲覧

c++のstatic変数について

ryo_se

総合スコア68

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

C++

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

0グッド

0クリップ

投稿2016/01/28 10:05

最近C++の勉強を始めているのですが、static変数でわからないことがあります。

Javaで下記のようなコードがあったとします

class Test { static public final int test = 1; }

上記の値を別のクラス等で使用する場合、
「int val = Test.test」のようにするかと思います。

そこでC++でも同じようなものを作りたいのですが、うまくいきません。
現在下記のような形式で作成しています。

ヘッダファイル↓

class Code { public: int success; Code(){ success = 0; } };

呼び出し元cppファイル↓

//未解決のシンボルエラーがでる return Code::success

ご教授いただければ幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

C++ は最近勉強し始めたばかりの初心者ですので(この質問を見てメンバアクセスの書式を知りました)
文法云々の話はできません。コンパイルしてみて通った結果でお話します。
外していたらごめんなさい。

Java の

Java

1class Test { 2 static public final int test = 1; 3}

に対応する C++ の記述はおそらく

C++

1class Test { 2public: 3 static const int test = 1; 4}; 5

となると思います。
static, public, int の意味はおそらく JavaとC++でほぼ同じなのだと思います。
(C言語では static は全然別の意味なので、C++ が本当にJavaと同じなのかは
ちょっと自信が持てません)
そして、final に const が対応すると思います。
const 無しだと書き換え可能なので、どこかで書き換えられる(破壊される)危険が残ってしまいます。

あなたの作りたかったコードは Java で書くとこんな感じだったと予想します。

Java

1public class Code { 2 static final int success = 0; 3} 4 5public class Main { 6 7 public static void main(String[] args) 8 { 9 Main main = new Main(); 10 11 System.out.printf( "Code.success=[%d]\n", main.sub() ); 12 } 13 14 private int sub() 15 { 16 return Code.success; 17 } 18} 19

このコードを C++ で書き換えると、現在の私の力だとこんな感じになります。
( C++ だと printf を使うべきじゃないのかもしれませんがそこは私の慣れた方法を使っています。)

C++

1#include <stdio.h> 2 3class Code { 4public: 5 static const int success = 0; 6}; 7 8int sub( void ); 9 10int main() 11{ 12 printf( "Code::success=[%d]\n", sub() ); 13} 14 15int sub() 16{ 17 return Code::success; 18}

ちなみに、static final にしろ、 static const にしろ、
書き換えられない値の名前は、他の変数などと区別がつくように
書き方を変えることが多いです。
Java 等でも、Code.SUCCESS といったような形式で書くことを
コーディング規約で決めている職場も多いと思います。
C++ に関してはそのあたりどうなっているのか、
初心者なのでよく知りません。

投稿2016/01/28 12:26

kozuchi

総合スコア1193

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

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

Chironian

2016/01/28 12:45 編集

おお、Javaのfinalって変数につけると「変更できない」なのですね。 ならば、kozuchiさんの言うとおり、static const int success = 0; が正解です。 C++のstatic constな変数(定数)は、宣言文で初期化できますので。 C/C++では全部大文字のシンボルはマクロ名に使われることが多いです。 Google Style Guideでは、グローバルな定数(クラス内のstatic const含む)は小文字のkで始めると決めているようです。 http://www.textdrop.net/google-styleguide-ja/cppguide.xml#%E5%AE%9A%E6%95%B0%E5%90%8D 他でも同様な規約を見たことあります。(確かSymbian OS)
kozuchi

2016/01/28 12:55

Cから Java に移行した人間の多くがまず最初に探すのが static final だと思います。 #define に対応する機能が無いとハードコーディングの排除に困るからです。 ですので、static final が書き換え不能であることには強いこだわりがあります。 Java で static final なメンバを全大文字にすることが多いのも、 C言語のコーディングスタイルからの習慣を引き継ぎたい人が多かったからでしょう。 その点、#define が使える C++ でどうしているのかは興味があります。 #define マクロとの混同を避けるためにあえて全大文字以外の命名規約にしているか、 同等のものとして同じ命名規約にしているのか。 ただ、C言語の利用経験が長い人間の感覚では、どちらも紛いものののように見えます。 「書き換え不能」という点について#define マクロのような絶対の安心感が無いからです。
ryo_se

2016/01/28 13:07

無事提示していただいたコードで実行できました。 他の皆さまもありがとうございます。 最近Javaはユーザサポートを行ってくれる言語だと改めて実感しています。 C++は厳格にチェックしてくるので難しいですね・・
Chironian

2016/01/28 13:32

kozuchiさん。 > Cから Java に移行した人間の多くがまず最初に探すのがstatic final だと思います。 なるほど。 > #define マクロとの混同を避けるためにあえて全大文字以外の命名規約にしているか、同等のものとして同じ命名規約にしているのか。 static const定数を全部大文字で書いてあるソースはあまり見ないですね。 Google Style Guideもそうですが、前者を選択する人が多そうな印象です。 マクロはIDE上でポイントしても内容が表示されないので、定数を定義するためには使わない方がデバッグしやすいです。なので、混同を避けるためにも異なる命名規則にするケースは少なくないと思います。 > 「書き換え不能」という点について#define マクロのような絶対の安心感が無いからです。 ああ、なるほど。確かに定数領域を書き換えることができるのがC言語の怖いところですもんね。でも、C++なら簡単にはconstへ書き込みできないので、ちゃんとconstつけておけば比較的安心ですよ。
guest

0

こんにちは。

それですと、普通にメンバ変数が定義されているだけです。staticになっていません。
下記のように書けば通ります。

C++

1class Code { 2public: 3 static int success; 4}; 5int Code::success=0;

コンストラクタはそのクラスのインスタンスを作るものです。その中でstaticメンバを初期化した場合、何か最低1つインスタンスを作るまで初期化されません。使い方によっては遅すぎると思います。

ですので、staticメンバ変数は普通にグローバル変数と同じ方法で初期化することが多いです。
クラスのstaticメンバ変数はグローバル変数と事実上同じものですし。

投稿2016/01/28 10:15

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問