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

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

新規登録して質問してみよう
ただいま回答率
86.02%
C++

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

Q&A

解決済

isとは何を示しているか

Y.R.T
Y.R.T

総合スコア42

C++

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

2回答

0グッド

0クリップ

1728閲覧

投稿2020/08/14 07:58

下記構文は、手入力でIPv4を入れて出力するのですが。
構文内にある『is』とはなにを示していますか?

is >> b1 >> d1 >> b2 >> d2 >> b3 >> d3 >> b4;
は、なにをしていますか?

また、
constexpr unsigned long to_ulong() const noexcept
は必要ですか?

#include <iostream> #include <array> #include <sstream> #include <assert.h> class ipv4 { std::array<unsigned char, 4> data; public: constexpr ipv4() :data{ {0} } {} constexpr ipv4(unsigned char const a, unsigned char const b, unsigned char const c, unsigned char const d) : data{ {a,b,c,d} } {} explicit constexpr ipv4(unsigned long a) : data{ { static_cast<unsigned char>((a >> 24) & 0xFF), static_cast<unsigned char>((a >> 16) & 0xFF), static_cast<unsigned char>((a >> 8) & 0xFF), static_cast<unsigned char>(a & 0xFF) } } {} ipv4(ipv4 const& other) noexcept : data(other.data) {} ipv4& operator=(ipv4 const& other) noexcept { data = other.data; return *this; } std::string to_string() const { std::stringstream sstr; sstr << *this; return sstr.str(); } constexpr unsigned long to_ulong() const noexcept { return (static_cast<unsigned long>(data[0]) << 24) | (static_cast<unsigned long>(data[1]) << 16) | (static_cast<unsigned long>(data[2]) << 8) | static_cast<unsigned long>(data[3]); } friend std::ostream& operator<<(std::ostream& os, const ipv4& a) { os << static_cast<int>(a.data[0]) << '.' << static_cast<int>(a.data[1]) << '.' << static_cast<int>(a.data[2]) << '.' << static_cast<int>(a.data[3]); return os; } friend std::istream& operator>>(std::istream& is, ipv4& a) { char d1, d2, d3; int b1, b2, b3, b4; is >> b1 >> d1 >> b2 >> d2 >> b3 >> d3 >> b4; if (d1 == '.' && d2 == '.' && d3 == '.') a = ipv4(b1, b2, b3, b4); else is.setstate(std::ios_base::failbit); return is; } }; int main() { ipv4 a(168, 192, 0, 1); std::cout << a << std::endl; std::cout << a.to_string() << std::endl; ipv4 b = a; ipv4 c; c = b; ipv4 ip; std::cout << ip << std::endl; std::cin >> ip; if (!std::cin.fail()) std::cout << ip << std::endl; }

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

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

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

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

cateye

2020/08/14 08:10 編集

IPアドレスを、組み立てているようですが、std::istream(std::cin)ではないですか?
Y.R.T

2020/08/14 08:38

ありがとうございます。

回答2

1

ベストアンサー

>構文内にある『is』とはなにを示していますか?

std::istream型の変数だと思います。(istreamを略してisとしている)

>is >> b1 >> d1 >> b2 >> d2 >> b3 >> d3 >> b4;
>は、なにをしていますか?

istreamから、7個の値を順に、b1, d1,,,, b4に読み込んでいると思います。
>if (d1 == '.' && d2 == '.' && d3 == '.')
とあるので、ドットが3個入ってくることを期待しているようです。

>constexpr unsigned long to_ulong() const noexcept
>は必要ですか?
このコードの中ではto_ulongは呼び出されていませんので、
必須ではないですね。

投稿2020/08/14 08:43

tajin_nabe

総合スコア191

Y.R.T👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

Y.R.T

2020/08/14 08:46

ありがとうございます。

1

is >> b1 >> d1 >> b2 >> d2 >> b3 >> d3 >> b4;
その少し上に書かれています。
std::istream& is
なので、istream、入力ストリームかと思います。

オペレーターのオーバーロードなので、入力ストリーム >> ipv4 と書かれた時の動作を定義しています。

実際に呼び出しているのは、std::cin >> ip;の部分なので、
isの実体は、std::cin になるかと思います。

投稿2020/08/14 08:21

amiya

総合スコア1216

Y.R.T👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

Y.R.T

2020/08/14 08:42

ありがとうございます。 理解できました。 to_ulong()が宣言されていますが、これは必要ですか? どこにも使われていないようですが。。。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C++

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