• ベストアンサー

引数のオブジェクト

C++のクラスを引数にするとき、そのコンストラクタがオーバーロードされている場合、その引数のところにオーバーロードされているパターンの型を指定できるのでしょうか? また、引数があるクラスで、そのクラスのコンストラクタに更に別のクラスが指定されている場合に、そのクラスのコンストラクタにその指定ができるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

>といった呼び出しができるかという質問です。 随分と質問が短かくなってますが。 Foo(XClass(3)); とかなら XClass オブジェクトから YClass オブジェクトへの暗黙的な キャストが行われるので合法ですが、int から YClass への暗黙的なキャスト方法は 用意されていないので、コンパイルエラーになると思われます。

noname#230240
質問者

補足

キャストというのはコンストラクタの呼び出しと考えてよいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.3

>キャストというのはコンストラクタの呼び出しと考えてよいのでしょうか? コンストラクタの呼び出しは XClass(3); で、キャストは (XClass)3; または static_cast<XClass>(3); キャスト演算子が実際にどのようにオブジェクト 3 に作用するかは XClass の実装次第です。

noname#230240
質問者

お礼

ありがとうございました。これで解決しました。

全文を見る
すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>その引数のところにオーバーロードされている > パターンの型を指定できるのでしょうか? 質問の意図がよくわかりません void foo(AClass); というプロトタイプの関数があって AClass のコンストラクタが AClass::AClass() { /* ... */ } AClass::AClass(int) { /* ... */ } と複数あるときに foo(AClass(5)); と foo を呼び出したいということですか? >引数があるクラスで、 引数があるクラスとは何ですか? > そのクラスのコンストラクタに更に別のクラスが指定されている場合に、 AClass::AClass(BClass b) { /* .. */ } ということですか? > そのクラスのコンストラクタにその指定ができるのでしょうか? 「その指定」とは何の指定ですか? BClass のコンストラクタがやはり BClass::BClass() { /* ... */ } BClass::BClass(char) { /* ... */ } と複数あって、 AClass aObj(BClass('b')); と AClass のインスタンスを生成したいということですか? 不完全でも良いので、したいことをコードで書くとアドバイスが得られるでしょう。

noname#230240
質問者

補足

ありがとうございます。 僕がしたいコードは、 class XClass{   …   public:   XClass(int) }; class YClass{   …   public:   YClass(const XClass&); }; void Func(YClass obj) { … } int main() {   Func(3);   return 0; } といった呼び出しができるかという質問です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 実引数リストと仮引数リストの長さが異なります

    実引数と仮引数はあっているはずですが、次のエラーが出ます。どうしてでしょうか? ------エラー----------------------- java: クラス Itemのコンストラクタ Itemは指定された型に適用できません。 期待値: 引数がありません 検出値: java.lang.String,int,java.util.Date 理由: 実引数リストと仮引数リストの長さが異なります -------------------------------------------------- public class Main { public static void main(String[] args) { String name= "test"; int price = 0; Date date = new Date(); Item item = new Item(name,price,date);//コンストラクタ実引数 } } class Item{ String name; int price; Date date; void Item(String name, int price, Date date)//コンストラクタ仮引数 { this.name = name; this.price = price; this.date = date; } }

    • ベストアンサー
    • Java
  • 多数の引数で初期化されるクラスの初期化について。

    C++のクラスについての質問なのですが、多数の引数によって初期化され、初期化されないうちは全てのメソッドは機能しないものとします。 このようなclassの初期化についていろいろ考えているのですが、 1,構造体を渡す、  この方法では派生クラスで初期化する場合など凄く難しいと思う。  派生先で動的に決定される場合など、基底クラスより初期化されてくるので、動的に作成した引数を渡せない。 2,初期化専用メソッドをつくり、それが渡されるまで全てのメソッドをブロックする。  初期化されるまでは全てのメソッドは機能しないのだからそのあたりのコーディングが複雑化する。 3,全てコンストラクタの引数に取る。  コンストラクタが非常に長くなる。  デフォルト引数を使えばある程度改善されますが、それでも最後の要素を書き換えたいときなどとても長くなる。 現在は3の方法でコーディングを行っているのですが、このようなクラスの初期化方法でいい方法はないのでしょうか?

  • C++、コンストラクタの引数の数を可変にしたい

    次のようなプログラムを作ろうとしています。 あるクラスComponentは DIM(整数)次元(要素数)のdouble型配列と ここで DIM は別のところでconstで宣言されています。 (他にもいくつか変数を持っているのですが話に関係ないので割愛します) とりあえずこんな感じにしたいです。 class Component{ public: double x[DIM]; Component(double x,double y,double z, ,,,,,); //コンストラクタ } ここでコンストラクタComponentは引数にDIM個の実数をとり、たとえば DIM = 3のとき Component obj(1.0,2.0,3.0); と宣言したら obj.x[0]=1.0 obj.x[1]=2.0 obj.x[2]=3.0 となるようにしたいのです。 むろん代入すること自体は代入すればよいのですが 外で宣言されているDIMによってコンストラクタの引数の数が変わってしまいます。 こういう時はどのような解決策があるでしょうか。 今書いたのと全然違うやり方でもかまいません。 (ただ何個も何個もコンストラクタをオーバーロードするのは避けたいです。 いろんなDIM次元で実験がしたく、きりがありません)。 よろしくお願いいたします!

  • C++変数宣言時のコンストラクタについて

    Java開発をこれまでやってきたのですが、 C++を学ぼうとしています。 C++では下記のように宣言した場合hogeは インスタンスになり、Hogeクラスのコンストラクタが呼ばれるようなのですが、 Hoge hoge; Hogeクラスのコンストラクタが下記のような引数を持つものしか定義されていなかった場合は どの様な振る舞いをするのでしょうか? Hoge(int num); Javaでは引数の有るコンストラクタしか宣言しなかった場合はデフォルトコンストラクタは 作られなかったと思うのですが、c++では引数のないデフォルトコンストラクタができてるのでしょうか? また、デフォルトコンストラクタが出来ていなかった場合、 Hoge hoge; というようにプリミティブ型のような変数宣言の仕方で引数有りのコンストラクタを呼ぶことは出来るのでしょうか?

  • クラス型の配列の引数指定

    x[ ] point = new x[ 6 ]; for ( int i = 0; i < 6; i++ ) { point[ i ] = new x( ); } このようにクラス型配列をnewした場合、xの引数を指定するにはどうすればよいのでしょうか? 複数のコンストラクタを用意して、場合分けをしたいのですが。

  • オブジェクト指向で分からないことが。

    オブジェクト指向で分からないことが。 1.クラスAから、文字列引数を指定して、クラスBがインスタンス化されたオブジェクトを取得する。 (getInstance的メソッド)引数の文字列にマッピングされたオブジェクトを取得する感じ。 2.1.で取得したオブジェクトから、各オブジェクトを取得するメソッドを呼び出し、オブジェクトを取得する。(仮にクラスC) 3.2.で取得したクラスCのメソッドを呼び出す。 このとき、クラスCのメソッド内で、1.で利用された引数を利用したいです。 そもそもクラスCは、1.を経てしか取得されないものの為、再度1.の引数を渡したくありません。 内部的な値なので、スコープpublicのセッターを用意して、クラスA内からの書き換えが出来ては困ります。 こういう場合、どういうクラス設計を行えば良いのでしょうか?

    • ベストアンサー
    • Java
  • Android / AsyncTaskの第1引数

    ■コード Hoge hoge = new Hoge(); hoge.execute(); public class Hoge extends AsyncTask<Object, 第2引数, 第3引数> {  protected List<Piyo> doInBackground(Object... params) { ■質問1 ・executeで引数を渡していないに、なぜ引数を受け取れるのでしょうか? (doInBackgroundメソッド引数として受け取っているで合っている?) ・処理の流れ的には、executeで渡した引数がdoInBackgroundメソッド引数となり、その型をAsyncTask第1引数で指定している? ・それとも、executeで渡す引数の型をAsyncTask第1引数で指定しているから、予め指定された型のみをdoInBackgroundメソッド引数として受け取れる? ■質問2 ・リンク先に、下記主旨の記述があるのですが、「自分で好きに型を選択できる」とはどういう意味なのでしょうか? >冒頭の型変数のParamsはdoInBackgroundメソッドの引数で、自分で好きに型を選択できる >execute()メソッドの引数に渡されたものがこのdoInBackgroundのparamsとして渡ってくる ・paramsとして渡された型を、AsyncTask第1引数で宣言することで自由に変更できる? ・それとも、AsyncTask第1引数で指定することで、doInBackgroundのparamsとして渡されてくる型を制限(指定)できる? http://d.hatena.ne.jp/Nagise/20120309/1331265123

    • ベストアンサー
    • Java
  • 引数付きコンストラクタでコンパイルエラー

    MFCダイアログベースアプリを作成しています。 開発環境はVC++2005です。 CtestDlgクラスのOnBnClickedOk()関数内での処理、 CtestDlg2 dlg( &hoge ); にてCtestDlg2ダイアログ起動し、CString型変数hogeを、 CtestDlg2クラスのコンストラクタに引数として渡したいのですが、 コンパイルエラーが出てしまい、何が原因か分かりません。 解決法をご存知の方おられましたら、お手数ですがご教授お願い致します。 【エラー内容】 error C2664: 'CtestDlg2 ::CtestDlg2(const CtestDlg2 &)' : 1 番目の引数を 'CString *__w64 ' から 'const CtestDlg2 &' に 変換できません。(新しい機能 ; ヘルプを参照) 理由: 'CString *__w64 ' から 'const CtestDlg2' へは 変換できません。 コンストラクタはソース型を持てません、またはコンストラクタの オーバーロードの解決があいまいです。 【CtestDlgクラス内宣言】 void CtestDlg::OnBnClickedOk(){ CString hoge = "aaa"; CtestDlg2 dlg( &hoge ); dlg.DoModal(); } 【CtestDlg2クラスコンストラクタ】 //CtestDlg2::CtestDlg2(CWnd* pParent /*=NULL*/) CtestDlg2::CtestDlg2(CString* st, CWnd* pParent /*=NULL*/) : CDialog(CtestDlg2::IDD, pParent), m_st(st) { } 【CtestDlg2クラスヘッダ内宣言】 public: CtestDlg2::CtestDlg2(CString* st, CWnd* pParent /*=NULL*/); CString* m_st;

  • メソッドの引数としてのthisの意味

    java初心者です。教えてください。 メソッドの引数としてのthisは何を表しているのですか? いろいろ調べてみてthisには以下の2つの使用法があることがわかりました。 1.インスタンス変数の名前とインスタンスメソッド内のローカル変数名がかぶったときに、メソッド内でインスタンス変数を表すときにthis.変数名とする。 2.あるクラスのコンストラクタ内で、同じクラスの別のコンストラクタを呼ぶときに使う。 しかし、引数としてのthisの意味がわかりません。 具体的には、addMouseListener(this);や、g.drawImage(img,10,10,this);のthisです。 後者の場合はオブジェクトgのインスタンスメソッドなので、thisはオブジェクトgへの参照を表しているのでしょうか?

    • ベストアンサー
    • Java
  • explicitの定義は?

    C++においてexplicitについて調べると explicit <エクスプリシット>  「明示的」  引数をひとつだけ受け取るコンストラクタに付けることのできる C++ 言語のキーワード。  クラスを関数の引数として使う場合、その関数には、クラスのコンストラクタの引数になっているものも渡すことができてしまう。これは暗黙的にコンストラクタが呼び出されるからである。このとき、「コンストラクタの引数」がまるで「関数の引数」であるかのように振る舞ってしまい、本来ならコンパイルエラーとなって欲しい場面でも、見えない部分でコンストラクタが呼ばれることでコンパイルが通ってしまう。その結果、想定していない動作をする可能性がある。  そこで、コンストラクタには「暗示的に呼び出せない」ようにするためのキーワードがある。それが explicit である。このキーワードを付けたコンストラクタは、必ず明示的に呼び出される必要があり、前述のようなことをしようとするとコンパイル時にエラーが発生する。 となっていました 「クラスを関数の引数として使う場合、その関数には、クラスのコンストラクタの引数になっているものも渡すことができてしまう。」 のところが分かりません 具体例で説明してください 例えば template<class CharType,class Attr=char_traits<CharType>, Class Allocator=allocator<T> >class basic_string クラスのコンストラクタが explicit basic_string(const Allocator &a=Allocator()); ですがこのケースについて説明していただければ幸いです