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

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

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

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

Q&A

解決済

2回答

1021閲覧

enumのclassの問題で自力で考えてもできなったのでヒントが欲しいです。

sattsun

総合スコア25

C++

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

0グッド

0クリップ

投稿2019/08/02 15:18

#include <iostream>
enum E_MACHINE_TYPE
{
MACHINE_TYPE_1R = 0x89,
MACHINE_TYPE_2R,
MACHINE_TYPE_MAX
};

enum E_UNIT_TYPE
{
UNIT_TYPE_CONVEYOR,
UNIT_TYPE_HEAD,
UNIT_TYPE_MAX
};

struct T_CONVEYOR_PARAM
{
int clampType;
int loadSpeed;
bool operator== (const T_CONVEYOR_PARAM& other)
{

}

};

struct T_HEAD_PARAM
{
int headType;
};

// 共通通信パラメータ.
class AParam
{
public:
AParam::AParam(){}
AParam::~AParam(){}
};

// ホスト送信パラメータ.
// 別アプリケーションのホストへ情報を送信するときに使用するパラメータ.
class SendHostParam : public AParam
{
public:
SendHostParam::SendHostParam(){}
SendHostParam::SendHostParam(E_MACHINE_TYPE type):AParam(), m_machineType(type){}
SendHostParam::~SendHostParam(){}

void SetMachineType(E_MACHINE_TYPE& type){m_machineType = type;} E_MACHINE_TYPE GetMachineType(){return m_machineType;}

private:
E_MACHINE_TYPE m_machineType;
};

// ユニット送信パラメータ.
// 同アプリケーション内のユニットへ送信するときに使用するパラメータ.
class SendUnitParam : public AParam
{
public:
SendUnitParam::SendUnitParam(){}
SendUnitParam::SendUnitParam(T_CONVEYOR_PARAM param):AParam(), m_destUnit(UNIT_TYPE_CONVEYOR){}
SendUnitParam::SendUnitParam(T_HEAD_PARAM param):AParam(), m_destUnit(UNIT_TYPE_HEAD){}
SendUnitParam::~SendUnitParam(){}

void SetConveyorParam(T_CONVEYOR_PARAM& param){m_convParam = param;} T_CONVEYOR_PARAM GetConveyorParam(){return m_convParam;} E_UNIT_TYPE GetDestUnit(){return m_destUnit;}

private:
E_UNIT_TYPE m_destUnit;
T_CONVEYOR_PARAM m_convParam;
T_HEAD_PARAM m_headParam;
};

// 通信クラス.
class MachineCommunication
{
#define DEST_HOST (0x9999)
#define DEST_UNIT_CONVEYOR (0x8888)
#define DEST_UNIT_HEAD (0x8886)
public:
MachineCommunication::MachineCommunication(){}
MachineCommunication::~MachineCommunication(){}

// ホストに情報を送信する. bool SendHost(SendHostParam* param) { // DEST_HOST宛てにSendHostParamを送信(処理省略). } // 装置内ユニットに情報を送信する. bool SendUnit(SendUnitParam* param) { if(DEST_UNIT_CONVEYOR == param->GetDestUnit()) { // DEST_UNIT_CONVEYOR宛てにSendUnitParamを送信(処理省略). } else if(DEST_UNIT_HEAD == param->GetDestUnit()) { // DEST_UNIT_HEAD宛てにSendUnitParamを送信(処理省略). } else { return false; } }

};

問1:E_MACHINE_TYPEに定義を1つ増やす場合に問題があるかないかとその理由について記述
問2:E_UNIT_TYPEに定義を1つ増やす場合に問題があるかないかとその理由について記述

↑問1,2は何故定義を増やすと問題があるのでしょうか?そもそもどういう知識が必要ですか?

問3:MACHINE_TYPE_2Renumの整数値を答えよ
→何故0x90ではないのでしょうか?

問4:構造体を比較できるよう、構造体内の変数が完全一致した場合trueとなるように処理を埋めよ
問5:SendUnitParamクラスにSetDestUnit関数を値渡しで追加せよ

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

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

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

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

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

guest

回答2

0

問4で困っているみたいなので

struct A{ int x; float y; }; bool compare(const A &l, const A &r){ if (l.x != r.x) return false; if (l.y != r.y) return false; return true; }

投稿2019/08/07 09:53

izmktr

総合スコア2856

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

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

sattsun

2019/08/07 13:21

問4は↓ってことでしょうか? bool operator== (const T_CONVEYOR_PARAM& other) { if((clampType==other.clampType) &&(loadSpeed==other.clampType) { return TRUE; } return FALSE; }
guest

0

ベストアンサー

こんにちは。

↑問1,2は何故定義を増やすと問題があるのでしょうか?そもそもどういう知識が必要ですか?

問いは「問題があるかないか」です。言うまでもなく「特殊事情が無い限り問題ない」です。
そのenum型を定義はしていますが使っていませんので、仮に特殊事情があるとしてもそれを読み取れません。特殊事情の記載もなく読み取れもしない以上、修正すると問題があると言われても困ります。
「通行止めの看板が立っている」とか「通ったら危険や迷惑がかかりそう」なわけでない公道を通ってはダメと言うようなものです。

もしかすると出題者は、_MAXを定義しているのでその後に定義を追加したら「普通問題があるでしょう」と考えているかも知れません。仮にも出題者ですから、ないとは思いますが、もしも万が一そうであればその人は論理的思考ができないのでプログラマーには向いていません。
この手のenum型の場合_MAXの前に定義を追加する人が大半と思いますが、これは定義を増やすことに当たりますし、上記同様に特殊事情がない限り問題ありません。

→何故0x90ではないのでしょうか?

他で既に正確な回答がついているので略。

投稿2019/08/03 02:47

Chironian

総合スコア23272

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

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

Zuishin

2019/08/03 02:49

MACHINE_TYPE_MAX の値が変わる、もしくは最大値でなくなるのが問題ではありませんか?
sattsun

2019/08/03 03:07

他の人に聞いたところ 問1がSendHostParamの送信先で不整合になる可能性がある 問2が途中に足すと#defineとの数字の関連がずれるので正しい処理ができなくなる???(2はこの答で△) でした。 問1はつまりMACHINE_TYPE_MAXのあとに定義を追加するとMAX値が変わってしまうので、SendHostParamの送信先で不整合になる可能性があるということでいいのでしょうか? 問2がすみません、分かりません...
Chironian

2019/08/03 03:21 編集

Zuishinさん そのような「特殊事情」があれば問題ですね。それを読み取れないので問題ないとするしかないと思います。 「MACHINE_TYPE_MAX の値が変わる」は流石に「普通」にあると思います。そのためにこのような形式でMACHINE_TYPE_MAX を定義しているのですから。 「最大値でなくなる」は問題になるケースが多いと思いますが、必ずしもそうでもないです。例えば、下記のようなシンボルをMACHINE_TYPE_MAXの後に追加する必要が発生するケースもありますから。 MACHINE_TYPE2_1S=0x100, MACHINE_TYPE2_2S, MACHINE_TYPE2_MAX この後者がまずい特殊事情が読み取れず、しかもこのような必要が生じた時には定義を追加する人は多いと思いますよ。それを問題があるとするのは如何なものかと思います。 正直、設問が曖昧すぎるように感じます。
Zuishin

2019/08/03 03:31

SendHostParam という名前から、クライアント・サーバの双方で使われているヘッダのようです。同時にコンパイル・インストールできない事情は十分考えられるので、特殊事情があるとみなされるのではないでしょうか。 そうでなくとも、dll や COM やデーモンで使われることなども考えられるので、このような実装は考慮を要するのではないかと思いました。
Chironian

2019/08/03 03:48 編集

sattsunさん、Zuishinさん 要するに「特殊事情」を読み取れという設問かも知れないですね。 ごめん、私は読み取れませんでした。(あまり真面目に読んでいないというのもありますね。) 私ならホストとクライアントのバージョン不整合には対処します。バージョン一致しないとエラーにすることが多いです。それが出来ない時は、変更していはいけないヘッダにはその旨コメントします。いくらなんでもコメントもコーディング規約も無しは怖すぎ。
sattsun

2019/08/03 14:56

問4,5はどうなるのでしょうか?
Chironian

2019/08/03 15:46

特に難しい問いではないと思いますよ。まずはご自身で頑張ってみませんか?
sattsun

2019/08/03 23:52

問5はですか?void SetDestUnit(E_UNIT_TYPE param){m_destUnit = param;} 問4がさっぱりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問