【急募】ガチのマジでC++に詳しいプログラマ来てくれ!!
■ このスレッドは過去ログ倉庫に格納されています
class Range
{
public:
Range(int from, int to);
const float from;
const float to;
}
例えば上のようなクラスがあったとして、メンバ変数を初期化する際にfrom < toであることをチェックしてから初期化する、みたいなことがしたいんだけど可能?
コンスタント呼ぶ前に外部でチェックするのは無しで >>2
>>3
コンストラクタの中でチェックすると初期化が先に走っちゃう コンストラクタ呼ぶ前は無しでコンストラクタ呼んだ後がダメなら無理でしょ
インスタンス作って返すファクトリメソッドでも作れば? >>7
なぜ
コンストラクタで例外投げるのは初期化中に例外投げるわけだけど constじゃなくてリテラル返す関数にすれば良くね
virtualでオーバーライドできるし、プリプロセスタイミングやコンパイルタイミングでチェックはconstexprとかつけてない限りはされんはず chatGPTの回答
はい、可能です。コンストラクタ内で条件チェックを行い、不正な場合は例外を投げることができます。例えば次のような実装が考えられます。
Range::Range(int from, int to) : from(from), to(to)
{
if (from >= to) {
throw std::invalid_argument("'from' must be less than 'to'");
}
}
このようにして例外を投げることで、不正な引数が渡された場合に適切に対処することができます。
C++の構文しらんから正しいかわからんけど class Range
{
public:
Range(float from, float to);
const float from;
const float to;
float checkFrom(float from, float to);
}
Range::Range(float from, float to) : from(checkFrom(from, to)), to(to)
{
};
一応こんな感じでできるか…
なんか不恰好な気がするけどもっと良い方法無いかな >>11
いやそれチェックする前に初期化終わってるんよ 初期化しないってどういうこと?メモリアドレスが固定なの? >>15
初期化しないんじゃなくて例外を投げるなら初期化前に投げたいって話 >>17
>>1で挙げた例はメンバがfloatだからほぼ関係無いんだけどこれがfloatではなく初期化処理自体が重たいクラスだった場合に、コンストラクタの引数が不正ならその重たい初期化処理を走らせる前にさっさと例外を投げたい、みたいな感じ >>19
コンストラクタに渡せる条件の確認だからそのクラス自身に責任を持たせたい なんで本来想定してるコード書かずにfloatで書いたの?
重くなるコンストラクタの例を書けよ >>16
コンストラクタのラッパー関数用意すればいいって話かな そのクラスのstaticメソッドでcreateInstanceみたいなの作れ >>22
うーんそれだと結局外部でチェックすることになるけどまあそれが無難なのかなぁ
さっきのファクトリメソッド作れってレスの考えだね class RangeBase
{
public:
RangeBase(int from, int to); //ここでチェックして例外投げる
}
class Range : Public RangeBase
{
public:
Range(int from, int to); //最初にRangeBase(from, to); 呼ぶ
const float from;
const float to;
} >>25
メモリリークしないように例外投げればいけるんかな >>23
なるほど、インスタンス生成関数をクラス自身に持たせる発想か
それ結構良いかも コンストラクタをprivateにしてインスンス生成用staticメソッドを用意するところまでは同じでしょ >>26
おおおお基底クラスのコンストラクタを利用するのか、なるほど
リスコフ置換原則に反してはいるけど面白い
全く思い付かなかった >>32
RangeBase(from, to);じゃなくて
RangeBase(from, to),だったっけか
C++書かなくなって久しいので細かい書き方違ってたり
うまくいかなかったらごめん >>33
const無かったら生成時のvalidation無駄じゃん >>26で思い付いたけど引数違いのコンストラクタを定義してもいけそう
ダミーの引数付けることになるが >>34
単純にロジックで上書き弾いちゃえば?
大量生成しないなら速度も落ちないよ
もし勉強のためにconstで縛り入れてたらすまんな >>39
すまん取り消す
上書きじゃなくて大小比較か……
しかもコンストラクタでやらないといけないのか
だから例外出すしか無いのか >>23だとこんな感じか
class Range
{
private:
Range(float from, float to) : from(from), to(to) {};
public:
static Range createInstance(float from, float to)
{
check(from, to);
return Range(from, to);
}
public:
const float from;
const float to;
private:
static void check(float from, float to)
{
if (!from < to) throw std::exception("from < to is not satisfied.");
}
}; ■ このスレッドは過去ログ倉庫に格納されています