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

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

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

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

Q&A

3回答

1240閲覧

c++で初期値を設定したいです

musui_etano-ru

総合スコア0

C++

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

0グッド

0クリップ

投稿2021/06/13 10:44

編集2021/06/13 12:13

前提・実現したいこと

言語はc++です。
学校での課題で、自動販売機のシュミレートをする内容です。
1つ目のコードはあらかじめ出されたもので、このコードをもとに2つ目のコードを記入し、動かしてみようという内容でした。

やりたいこととしては、釣り銭が各種1枚ずつしか入っていない状態を(VendingMachine1クラスのコンストラクターを使って)初期状態になるようにしたいです。

実践したことに詳しく書きますが、私の行った方法が何かが足りないのか、それとも根本的にやり方が違うのかもわかりません。

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

VendingMachine1.obj : error LNK2005: "public: __thiscall VendingMachine1::VendingMachine1(void)" (??0VendingMachine1@@QAE@XZ) は既に kadai3.obj で定義されています。 kadai3.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

c++

1#include<iostream> 2#include<vector> 3#include<string> 4#include<utility> 5#include<map> 6#ifndef PE2_VM1 7#define PE2_VM1 8using namespace std; 9class VendingMachine1 { 10private: 11 vector<string> goodsNames; // 販売品名称 (現バージョンでは固定) 12 vector<int> prices; // 価格 (現バージョンでは固定) 13 int numGoods; // 販売品数(何種類の販売品か)(現バージョンでは固定) 14 int payed; // 投入額の保存用(釣り銭計算のため) 15 map<int,int> coins; // 保持しているコインの種類と数(数は設定可能) 16 void calc(int sel); // 販売品番号を受け取り prices とpayed からおつりとして出すコインを計算し表示する。  17public: 18 VendingMachine1(); // コンストラクタ 19 VendingMachine1(int numOfCoin1, int numOfCoin2, int numOfCoin3, int numOfCoin4); 20 // コイン残数を設定 1:500Yen 2:100Yen 3:50Yen 4:10Yen 21 VendingMachine1(int numOfCoins[4]); 22 // コイン残数を設定 [0]:500Yen [1]:100Yen [2]:50Yen [3]:10Yen 23 void showPrices(); // 販売品と価格を表示する 24 void setPayed(int val); // 投入額を val として渡し payedに設定する 25 int selectGoods(); // 販売品の選択するように表示し,販売品の番号を受け取って返す。calcを呼び出しおつりの計算をして表示する。 26 void showCoins(); // チェック用,コインの残数を表示する。 27}; 28 29#endif

該当のソースコード

c++

1#include <iostream> 2#include "VendingMachine1.hpp" 3using namespace std; 4int insertCoins(); 5VendingMachine1::VendingMachine1(){ 6 int numOfCoin1, numOfCoin2, numOfCoin3, numOfCoin4 = 1; 7} 8int main(){ 9 VendingMachine1 vd1; 10 vd1.showPrices(); 11 vd1.setPayed(insertCoins()); 12 cout << vd1.selectGoods() << "\n"; 13 return 0; 14} 15int insertCoins(){ 16 int val; 17 cout << "お金を投入:"; 18 cin >> val; 19 return val; 20}

試したこと

1番目のコードで
VendingMachine1(int numOfCoin1, int numOfCoin2, int numOfCoin3, int numOfCoin4);
に書かれている値の初期値を1にしたいため、
2番目のソースコードで、
VendingMachine1::VendingMachine1(){
int numOfCoin1, numOfCoin2, numOfCoin3, numOfCoin4 = 1;
}
と記入し、初期値を設定しようとしました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

BeatStar

2021/06/13 11:05 編集

>> 5~7行目の方法で初期値を設定しようとしました とありますが、何のことでしょうか。 少なくともコードらしきものが2つあります。また仮にどちらの方かわかっても、単に7行目と言われてもわかりません。 まずは相手に伝わるように書きましょう。プログラミングはその後です。 人間相手ですらこれですから、機械とのコミニケーションなんて早いです。 まずは相手に伝わるように書きます。
musui_etano-ru

2021/06/13 11:13

ごもっともでございます。 現在試したことの欄を修正いたしました。 今後はより分かりやすく質問の内容が伝わるように精進していきます。 ご指摘ありがとうございました。
退会済みユーザー

退会済みユーザー

2021/06/14 01:16 編集

そもそも、このサイトは学校の課題を教えて貰うためサイトではありません。 学校の課題なら、学校の先生に聞いた方が良いですよ。言語についてどの程度教えたか把握しているでしょうし。課題はあなたの授業の理解度、次の授業の前提知識の確認のために出しているようなものですから、赤の他人に聞いて答えを貰っても意味がないでしょう。エラーメッセージをWebで調べたり、デバッグしてプログラムの動きを確認する調べ方を考えるのも授業の一環だと思います。 [推奨していない質問] https://teratail.com/help/avoid-asking > 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。
musui_etano-ru

2021/06/14 01:36

ごもっともでございますね。 学校に行く機会もなく、誰かに聞くことが殆どなかったためネットで投稿して手伝ってもらおうなどと甘い考えを持ってしまいました。 そして、この課題が出された授業はもう終わっていて、質問などが締め切られてしまった状態でした。課題の提出はかろうじて期限を伸ばしてもらったものの、自身の力のみでは完全には解けないと判断しました。 期間内に先生に聞くということを怠り課題から逃げてしまいました。すみません。 これからはわからないことはすぐに先生に聞くことにします。 見苦しい言い訳とわがままを言ってしまいすみません。
guest

回答3

0

おそらく与えられたヒントとやらを誤解しています。
あなたは、VendingMachine1::VendingMachine1()をあなたのソースで書いてはいけません

「定義されているVendingMachine1(int numOfCoin1, int numOfCoin2, int numOfCoin3, int numOfCoin4); を利用して初期値を与えろ」なのではないかと思います。

投稿2021/06/13 16:13

asm

総合スコア15149

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

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

musui_etano-ru

2021/06/14 02:19

なるほど、重要なヒントをありがとうございます。 方法を模索してみます。 回答ありがとうございます。
fana

2021/06/14 04:15

「VendingMachine1 というクラスの実装に手を入れろ」という話ではなくて, 単に「VendingMachine1はこちらで用意したから,それを使ってみせてみろよ.できればな.」という話ですね.
guest

0

エラー自体はkadai3.cppでもVendingMachine1::VendingMachine1()を書いてあるので多重定義になっているのかなと思います。そのエラーと質問の内容は本質的に無関係です。

やりたいこととしては、釣り銭が各種1枚ずつしか入っていない状態を(VendingMachine1クラスのコンストラクターを使って)初期状態になるようにしたいです。

c++

1map<int,int> coins; // 保持しているコインの種類と数(数は設定可能)

このメンバ変数を初期化するという意味でしょうか?コインの種類の定義がありませんので仮に4種類とした場合は下記のとおりです。

C++

1VendingMachine1::VendingMachine1() : 2 coins{{0,1},{1,1},{2,1},{3,1}} 3{}

どこかに下記のようにコインの種類が定義されているのではないでしょうか?

c++

1enum { 2 Coin1, 3 Coin2, 4 Coin3, 5 Coin4, 6};

投稿2021/06/13 12:47

Serbonis

総合スコア586

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

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

musui_etano-ru

2021/06/13 13:03

解答していただきありがとうございます。 コインの種類は定義されているのですがobjファイルの形式で渡されているため、中身を見ることができませんでした。 学校の先生から与えられたヒントにより、 VendingMachine1(int numOfCoin1, int numOfCoin2, int numOfCoin3, int numOfCoin4); 上記の4つの値の初期値を1にするものだと思っていたのですが、初期値を1にすることは可能でしょうか。拙い日本語ですみません。
musui_etano-ru

2021/06/13 13:06

追記: VendingMachine1::VendingMachine1() : coins{{0,1},{1,1},{2,1},{3,1}} {} こちらの方法で試しましたが、同じエラーが出てしまいコンパイルが通りませんでした。
Serbonis

2021/06/13 22:37 編集

>コインの種類は定義されているのですが 他に.hファイルが渡されていてそこに定義されていると思います。そのファイルは中を見ることができます。 // VendingMachine1::VendingMachine1() kadai3.cppで定義済みなので削除 VendingMachine1::VendingMachine1(int numOfCoin1, int numOfCoin2, int numOfCoin3, int numOfCoin4) : coins{{0,numOfCoin1},{1,numOfCoin2},{2,numOfCoin3},{3,numOfCoin4}} {} 初期化時に設定したい数を渡します。 VendingMachine1 vd1{1,1,1,1};
guest

0

メンバ初期化子リストを使用します

VendingMachine1::VendingMachine1() : numOfCoin1(1), numOfCoin2(1), numOfCoin3(1), numOfCoin4(1)
{
}

コンストラクタ - C++ 入門


(追記)
質問のコードをよく読まないで回答してしまいました。
上記のコードは numOfCoin1 などのメンバを 1 に初期化するものですが、そんなメンバは存在していませんね。
コンストラクタの引数 numOfCoin1 などが、どうなって何を初期化する意図なのかがわかりません…

投稿2021/06/13 11:26

編集2021/06/13 11:33
itagagaki

総合スコア8402

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

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

musui_etano-ru

2021/06/13 12:05

すみません…課題で提示されたコードが一つ目のコードしかなく、そのコードをもとに二つ目のコードを記入し、動かしてみようという課題でした。 もっと詳細にわかるよう質問を訂正します。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問