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

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

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

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

Q&A

2回答

1042閲覧

C++の配列の関数定義と呼び出し方について

santaro

総合スコア18

C++

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

0グッド

0クリップ

投稿2018/03/22 15:57

編集2018/03/22 16:16

C++のヘッダーで

c.h

c.h

1class bun { 2void erase(vector<float> pp); 3vector<float> num; 4}

があったとき、c.cppでは

void bun::erase(vector<float> pp){ //ここの引数にnum[3]とかnum[4]とかの引数を入れたいのですが、その場合のこの関数内でのnum[~]の値はどのように記述するのでしょうか? //ここの num[]+5 とか書くとエラーになってしまうのですが、正式な書き方を教えてください }

例えば、num[3] = 5.5; の場合
erase()をするとその値は-3された値がnum[3]に代入されるような関数の場合の書き方を教えて欲しいです。
erase(num[3])と書くと num[3] は 2.5 になってるというような感じです。

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

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

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

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

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

LouiS0616

2018/03/22 16:02

引数を『入れる』という表現がなんとも漠然としている印象なのですが、eraseの実行前後でどのような変化が生じることを期待しているのでしょうか?
LouiS0616

2018/03/22 16:03

また、C#とCのタグは外してください。
guest

回答2

0

こんにちは。

erase(num[3])

とは書けないですよ。num[3]はfloat型ですが、erase()が受け取るのは、vector<float>型ですので型が異なります。

もしかして、次のような意味でしょうか?

C++

1void bun::erase(int index) 2{ 3 num[index] -= index; 4}

erase(3)と呼び出すとnum[3]の値が3減ります。


しかし、どうも外している気がします。
3が2箇所に使われているので、それがインデックスなのか減算する値なのか読み取れませんでした。

投稿2018/03/22 16:30

Chironian

総合スコア23272

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

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

santaro

2018/03/22 16:34

すいません、num[2]でもnum[3]でもnum[4]でも-3されるという意味でした。 それとerase()が受け取る値はnumに限らなく、num_other[]という配列(他の名前の配列)も受け取ることができる場合、 void bun::erase(~~)この~~の部分はどう書くのでしょうか?
Chironian

2018/03/22 16:43

ごめんなさい。何を言っているのか判らないです。 numはメンバ変数ですから、わざわざメンバ関数へ渡す必要ないですよ? erase関数は何らか型の動的配列std::vector<T>を受け取り、その要素を全て -3 したいという意味でしょうか? YESであればお手軽には下記ですが、やはり外しているような予感です。 template<typename T> void erase(std::vector<T>& oArray) {   for(auto& elem : oArray)   {     elem -= 3;   } }
Chironian

2018/03/22 16:44

すいません。別の名前でしたね。分かりました!! きっと下記です。 void erase(std::vector<float>& oArray) {   for(auto& elem : oArray)   {     elem -= 3;   } }
santaro

2018/03/22 17:07 編集

説明下手ですいません、、 例えば num[0] = 4; num[1] = 7; num[2] = 2; num[3] = 9; num_o[0] = 1; num_o[1] = 5; numnum[0] = 3; numnum[1] = 6; みたいなときに erase(num[2]); とかくと num[2] == -1 ; になるし erase(numnum[1]); とかくと numnum[1] == 3 になるみたいなイメージです、、、
episteme

2018/03/23 00:01

void erase(int index) { num[index] から 3 を引く } ではアカンのですか?
Chironian

2018/03/23 00:23

santaroさん。ならば下記ですね。 void erase(float& ioElement) {   ioElement -= 3; } しかし、その内容でしたら、bunクラスの非staticなメンバ関数として実装する意味はほぼありません。 staticメンバ関数の方がよいと思います。 class bun {   static void erase(float& ioElement)   {     ioElement -= 3;   }   vector<float> num; }
guest

0

こういうことでしょうか?

C++

1#include <iostream> 2#include <vector> 3 4#include "header.hpp" 5 6void Bun::subtract_at(int index, int diff) { 7 nums_.at(index) -= diff; 8} 9void Bun::print(void) { 10 for(auto num: nums_) { 11 std::cout << num << " "; 12 } 13 std::cout << std::endl; 14} 15 16int main(void) { 17 Bun bun{1.5, 2.5, 3.5, 4.5}; 18 19 bun.print(); 20 bun.subtract_at(3); 21 bun.print(); 22 23 return 0; 24}

実行結果 Wandbox

1.5 2.5 3.5 4.5 1.5 2.5 3.5 1.5

erase(num[3])と書くと num[3] は 2.5 になってるというような感じ

目的の変数を参照渡しする方法も無いことは無いですが、
参照渡しをむやみに使うよりインデックスで指定した方が無難だと思います。

メンバ変数へのアクセスも狭められますし。

追記

どうやらこういうことみたいですね。

C++

1void subtract(double& num, double diff=3) { 2 num -= diff; 3} 4 5int main(void) { 6 Bun bun{1.5, 2.5, 3.5, 4.5}; 7 auto& nums = bun.getNums(); 8 9 bun.print(); 10 subtract(nums[3]); 11 bun.print(); 12 13 return 0; 14}

実行結果 Wandbox

1.5 2.5 3.5 4.5 1.5 2.5 3.5 1.5

でもこれ、正直悪手だと思います。
せっかくクラスにvectorを閉じ込めたのに、外部からいくらでも操作出来てしまうので。

この方法を選ぶしかない状況ってあるんでしょうか。ちょっと考えなおした方が良いような。

投稿2018/03/22 16:32

編集2018/03/22 22:46
LouiS0616

総合スコア35660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問