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

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

C++

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

Q&A

解決済

3回答

1386閲覧

C++ グローバルスコープでオブジェクトが代入できない

gelman

総合スコア2

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

C++

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

0グッド

0クリップ

投稿2021/12/28 02:02

編集2021/12/28 02:18

前提・実現したいこと

C++ でクラスの勉強をしています。

main関数内では問題なくオブジェクトへ値が代入できたのですが、
グローバルスコープではエラーが発生しました。

発生している問題・エラーメッセージ

'pos' does not name a type

該当のソースコード

座標 x, y を管理するクラス POS を作成し、値を代入しようとしています。

C++

1#include <stdio.h> 2 3class POS { 4public: 5 int x; 6 int y; 7}; 8 9POS pos; // オブジェクト作成 10 11// グローバルスコープで代入しようとするとエラー 12pos.x = 1; 13pos.y = 2; 14 15int main() 16{ 17 /* 18 ここで代入すればOK 19 pos.x = 1; 20 pos.y = 2; 21 */ 22 printf("x:%lf y:%lf\n", pos.x, pos.y); 23 return 0; 24}

質問内容

  • グローバルスコープにおいて、オブジェクトへ代入ができないのはなぜでしょうか。
  • このような規則はどこを参照すれば記載があるでしょうか(初心者で調べ方が分りませんでした。)

以上、よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

pos.x = 1; pos.y = 2; は代入文です(初期化ではありません)。
代入文は実行されなければなりません。
実行されるには何らかの関数の中になくてはならず、そしてその関数が呼ばれなくてはなりません。

C++

1#include <stdio.h> 2 3class POS { 4public: 5 int x; 6 int y; 7 POS(int vx, int vy) { x = vx; y = vy; } 8}; 9 10POS pos{1,2}; // これならOK. 関数(コンストラクタ)が実行される 11// POS pos = { 1, 2 }; // これでもOK. この = は(代入ではなく)初期化だから 12 13int main() { 14 printf("x:%d y:%d\n", pos.x, pos.y); 15 return 0; 16}

※ グローバルスコープに変数を置くこと自体、褒められたことじゃありませんけどね...

投稿2021/12/28 02:24

編集2021/12/28 02:37
episteme

総合スコア16614

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

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

gelman

2021/12/28 02:40 編集

クラスだから代入できないのではなく、代入等の処理はすべて関数内で行われる必要があるのですね! (変数 i でも関数外では代入できないことを確認しました。) 勝手にクラスだから代入できないのかと思い調べていたので、分らずじまいでした、、 ご回答ありがとうございました。
episteme

2021/12/28 02:48

クラスでなくても: int x = 1; // OK. 定義(と初期化)だから x = 2; // error. (定義/宣言ではなく)代入だから
gelman

2021/12/28 02:54 編集

(初歩的過ぎて、理由が分らずモヤモヤしてました、、) 本当に助かりました。ありがとうございます!
guest

0

グローバルに書けるのは宣言か定義です。 任意の文は書けません。

C++ の公式な規格 (ISO/IEC 14882) は高価ですが、公式に発行される直前の草案 (ドラフト) は無料で見ることができます。 厳密な根拠が欲しい場合にはこれを参照することになるでしょう。

また、更新されていく規格を再編してわかりやすくすると同時に日本語訳も提供しているサイトとしては cppreference がとても有用です。 ただ、これはわかりやすく再編してはいるもののあくまでも仕様に対して厳密であることを指向しているので初心者向けの親切な解説はなく、欲しい情報にたどり着くのが初心者には難しいかもしれません。

C++ の仕様はそれなりに巨大で、これを見れば全部理解できるというようなものはなく、まずは入門書を読んでそれから少しづつ高度な資料を読んで身に着けていくしかしょうがないですね。

投稿2021/12/28 02:36

SaitoAtsushi

総合スコア5444

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

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

gelman

2021/12/28 02:50

>厳密な根拠が欲しい場合にはこれを参照することになるでしょう ありがとうございます! 初心者の自分には少し難易度が高いので、SaitoAtsushiさんが言われたように、入門書から徐々に学んでいきたいと思いました。
guest

0

pos.x = 1; pos.y = 2;

C/C++では関数の外にこのような文を書くことはできません。
プログラムが起動されたらまずmain()が呼ばれますので、その中にその文を書くなり、他の関数内にその文を書いてmain()から呼び出さなければなりません。

投稿2021/12/28 02:21

itagagaki

総合スコア8402

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

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

gelman

2021/12/28 02:34

早速のご回答ありがとうございました。 C/C++では関数外では、宣言、初期化のみが可能で 代入等の処理は関数内で行う必要があるのですね! epistemeさんの回答と合わせて理解できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問