🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

C++

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

Q&A

解決済

4回答

3722閲覧

C++のクラスのコンストラクタで親クラスに渡す引数を加工したい。

IK_O

総合スコア11

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

C++

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

0グッド

0クリップ

投稿2021/03/19 16:51

前提・実現したいこと

C++のクラスのコンストラクタで親クラスに渡す引数を加工したい。

詳細

このような親子クラスがあったとします。
class Parent
{
public:
Parent(int i){}
}

class Child : public Parent
{
public:
Child(int i) : Parent(i) {}
}

通常このようにインスタンスを作成したら、その引数はそのまま親クラスに渡されますが、
Child* c = new Child(5);

Childクラスのコンストラクタ内で引数を加工してから親クラスのコンストラクタに渡すことはC++では出来ないのでしょうか?

このような感じに↓

Child::Child(int i)
{
Parent(i * i);
}

これが出来ないと複雑な計算を経て親クラスへ渡したい場合、不便に思います。

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

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

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

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

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

guest

回答4

0

あるいはこんなのとか

C++

1class Parent { 2public: 3Parent(int i){} 4}; 5 6class Child : public Parent { 7 static int fun(int i) { return 複雑な計算; } 8public: 9 Child(int i) : Parent(fun(i)) {} 10};

投稿2021/03/20 00:36

episteme

総合スコア16612

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

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

IK_O

2021/03/20 13:53

ありがとうございます。 これも使えそうですね。
guest

0

ベストアンサー

ラムダ式でもいけるかと思います。

c++

1Child(int i) : Parent([=]{ return i*i; }()) {}

>Childクラス専用のメソッドを駆使して得た値
親クラスのコンストラクタを呼ぶ時点ではChildのメンバはまだ初期化されていないと思いますので、メンバの値を使うようなメソッドは動作が不安定になってしまうかと思います。

投稿2021/03/20 02:26

編集2021/03/20 02:28
Serbonis

総合スコア586

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

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

IK_O

2021/03/20 13:50

ラムダ式をよく知らなかったのですが、これは良いですね。 多少複雑な処理も書くことができます。 ありがとうございます。
Serbonis

2021/03/21 01:20

コンストラクタ以外のタイミングで、子クラス内から親クラスを初期化したい場合、new ((Parent*)this) Parent() とする方法もあります。placement new という文法です。
guest

0

やってみてコンパイルエラーにならず、実行してもエラーにならないことを確認すれば良いと思います。

投稿2021/03/20 02:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

こういうことですか?

c++

1Child(int i) : Parent(i*i) {}

投稿2021/03/19 16:53

yuki23

総合スコア1448

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

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

IK_O

2021/03/19 20:56

回答ありがとうございます。 (i * i) などの単純な簡単にケースはそのまま渡せますが、問題なのは switch文やif文、Childクラス専用のメソッドを駆使して得た値を親に渡す引数として設定する場合です。
y_waiwai

2021/03/19 21:33

それを質問文に書きましょう。 後付け設定をその都度言われては回答できませんぜ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問