visual c++で自作クラスをCMapWordToObに格納する方法
- visual c++を使って自作クラスをCMapWordToObに格納する方法について教えてください。
- 現在、自作クラスをCMapWordToObに格納しようとしていますが、エラーが発生しています。
- フォームで取得した値をobjMyクラスに挿入し、そのクラスをMapオブジェクトに挿入する方法を教えてください。
- ベストアンサー
visual c++ CMapWordToObでクラスオブジェクトの格納
visual c++を最近はじめたのですが、うまくいかなくて困っています。 1.自作クラス class myObj : CObject { private: CString mstrIpAdd; CString mstrNetAdd; CString mstrFilePathAdd; public: myObj(); //プロパティ設定 void setIpAdd(CString value); void setNetAdd(CString value); void setFilePathAdd(CString value); CString getIpAdd(); CString getNetAdd(); CString getFilePathAdd(); virtual ~myObj(); : : : ------------------------------------------ フォームでボタンを押すと実行する部分 myObj objMy; CMapWordToOb objMap; for(i = 0; i < 1 ; i++){ objMy.setIpAdd(edit); objMy.setNetAdd(combo); objMap.SetAt(i,objMy); } CMapWordToObに自分で作成したobjMyクラスを入れたいのですが、エラーが帰ってきます。 <エラー内容> error C2664: 'SetAt' : 2 番目の引数を 'class myObj' から 'class CObject *' に変換できません。 (新しい機能 ; ヘルプを参照) この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。 フォームで取得した値を、objMyクラスに挿入し、そのクラスをMapオブジェクトに挿入しているのですが、うまくいきません。 (^^; すみませんが対処方法を教えてくださいませ。よろしくお願いします。 文字数制限で全体のソースを入力できないため一部を表示しています。
- poposan
- お礼率48% (64/132)
- C・C++・C#
- 回答数4
- ありがとう数0
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
'うまくいかない'/'エラーになる'を説明してください。 - なにがどううまくいかないのですか? - なにをするとどんなエラーになるのですか? さらに、 - マニュアル/ドキュメントを読んでいますか? - 行き当たりばったりにコードを書いて悩んでいませんか? -> こんな感じでしょうか? 違います。 コレクションに格納する「要素」はちゃんとnewしたものですか?
その他の回答 (3)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> すでに両方試したのですが、うまくいきませんでした。 やはりエラーになるということでしょうか? コレクションに格納する要素はちゃんとnewしたものですか?
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
エラーメッセージを理解してください。 CObject*であるべき引数にmyObjを与えています。 ポインタを渡してあげましょう。
- kmb01
- ベストアンサー率45% (63/138)
objMap.SetAt(i,&objMy); でうまくいくかも
補足
ご解答ありがとうございます。 すでに両方試したのですが、うまくいきませんでした。 私の使い方が問題あるみたいで、もう少し勉強いたします 。
関連するQ&A
- VC++ MFC エラーコード C2248 private メンバ (クラス 'CObject'で…
VC++ MFC エラーコード C2248 現在、ダイアログAにあるコンボボックス(IDC_COMBO1)に単語を登録、削除する処理をしています。 ダイアログAには他に[登録]ボタン(IDC_BUTTON1)と[削除]ボタン(IDC_BUTTON2)があります。 IDC_COMBO1 を CComboBox m_combo; として // [登録]ボタン押下時 void CADlg::OnBnClickedButton1() { CString Txt, old; int ret = 0, count = 0, i; m_combo.GetWindowText(Txt); if ( strcmp(Txt, "") == 0 ) { AfxMessageBox( _T("語句を入力してください")); return; } // コンボボックスのリスト数取得 count = m_combo.GetCount(); for(i = 0; i < count; i++){ // IDC_COMBO1に登録済みの語句を順番に調べていく m_combo.GetLBText(i, old); // 既に登録済みの名前があった場合 if (oldFile == Txt){ ret = MessageBox( _T("上書きしますか?"), _T("語句登録"), MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 ); } } if ( ret == IDYES ) { return; } else if ( ret == IDNO ) { // 後ほど説明します CBDlg dlg; dlg.DoModal(); m_combo1.AddString(NewName); // extern CString NewName;←グローバル変数(Bダイアログから) return; } // 登録されていない語句の場合 m_combo.AddString(Txt); } 上記の登録の方、エラーなくコンパイルがとおり、コンボボックスにもちゃんと格納されています。 削除の方もエラーなくちゃんとコンボボックスから削除されます。 次に >else if ( ret == IDNO ) の部分なのですが [いいえ]ボタン(IDNO)が押された場合にはダイアログBが表示されます。 ダイアログBには語句を入力するエディットボックスIDC_EDIT1、[登録]ボタン(IDC_TOUROKU)、[取り消し]ボタン(IDC_TORIKESI)があります。 IDC_EDIT1 を CEdit m_ed1; として ここのBダイアログでもAダイアログ中のコンボボックスに格納されている語句が入力された場合はメッセージボックスを表示したいのです。 そこで void CBDlg::OnBnClickedTouroku() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 int rup, cnt, ret; CString oldf; CADlg cad; CComboBox cfdn = cad.m_combo; m_ed1.GetWindowText(NewName); // CString NewName;←グローバル変数 // Aダイアログ中のコンボボックスリスト数の取得 cnt = cfdn.GetCount(); for(rup = 0; rup < cnt; rup++){ // Aダイアログのコンボボックス中に登録されている語句取得 cfdn.GetLBText(rup, oldf); if (oldf == NewName){ ret = MessageBox( _T("本当に上書きしてもいいですか?"), _T("環境設定"), MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 ); } } if(ret == IDOK){ OnOK(); } else{ return; } } としました。 ここでコンパイルすると 1>c:\program files\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(1820) : error C2248: 'CObject::CObject' : private メンバ (クラス 'CObject' で宣言されている) にアクセスできません。 1> c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(558) : 'CObject::CObject' の宣言を確認してください。 1> c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(529) : 'CObject' の宣言を確認してください。 1> コンパイラでのこの診断により関数 'CCmdTarget::CCmdTarget(const CCmdTarget &)' が生成されました。 のようにエラーがでます。 調べてみると CComboBox cfdn = cad.m_combo; が原因のようです。 ググってみたりしたのですが解消法がわからず質問させていただきました。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 親子関係を持つ自作クラスのDownCast
.NET2.0ベースのVBです。次のコードをビルドしようとすると、CTypeの部分がエラーとなり、「変換演算子によって、ある型からその派生型に変換することはできません」とメッセージがでます。派生クラスに対して、ある一定の法則でダウンキャストさせたいのですが、なぜ不可能なのでしょうか。また、このようなアプローチは間違っているでしょうか。 Public Class Class1 ' このクラスは別ファイルに定義されており、 ' そのファイルは ReadOnly。 Public foo Public bar Public baz End Class Partial Class Class1 ' 継承クラスで実装すると、クラス階層構造がより一層複雑になるので、Partial として実装。 ' ダウンキャスト用にキャスト演算をオーバーロード Public Shared Narrowing Operator CType(ByVal value As Class1) As Class2 Dim result As New Class2 ' .foo は移さない! result.bar = value.bar result.baz = value.baz Return result End Operator End Class Public Class Class2 : Inherits Class1 Public hoge End Class
- ベストアンサー
- Visual Basic
- オブジェクトクラスとオーバースライド
Objectクラスを継承させてオーバースライドさせるプログラムを下記に作成したのですがSandaiクラスのオブジェクトstudent[1]の.student[1].inputNumber("09H999");が「シンボルが見つかりません」とエラーが表示されます。これはどこが足りないのですか?ご連絡をお願いします。 結果 student[0]: 身長: 180.2 cm, 体重: 70.3kg student[0] はclass Personです student[1]: 学籍番号:09H999, 身長: 168.3 cm, 体重: 55.2kg student[1] はclass Sandaiです class Person { private double height, weight; public void inputData(double ht, double wt) { height = ht; weight = wt; } public void showData() { System.out.println("身長: " + height + "cm, 体重:"+ weight + "kg"); } } class Sandai extends Person { private String number; public void inputNumber(String num) { number=num; } public void showData() { System.out.print("学籍番号:"+number+", "); super.showData(); } } class K13_2 { public static void main(String args[]) { Person student[] = new Person[2]; student[0] = new Person(); student[0].inputData(180.2, 70.3); student[1] = new Sandai(); student[1].inputData(168.3, 55.2); student[1].inputNumber("09H999"); for(int i=0; i<student.length; i++){ System.out.print("student["+(i)+"]:"); student[i].showData(); Class c1 = student[i].getClass(); System.out.println("student["+(i)+"]は"+c1+"です。"); } } }
- ベストアンサー
- Java
- C++のクラスについて
/*以下のコメントがある行では何故、コンストラクタ(class2::class2)を指定出来ないのですか? デストラクタ(class2::~class2)の場合も問題なくコンパイルが通り、実行できます (http://codepad.org/1oJkxjyZ の23行目) 開発環境 Windows XP SP3 コンパイラ:GCC 実行結果 class1のコンストラクタ class2のコンストラクタ aiueoの実行 class2のデストラクタ class1のデストラクタ */ #include<iostream> class class1; class class2; class class1{ public: class1(); ~class1(); private: class2*pointer; }; class class2{ public: class2(); ~class2(); void aiueo(); }; class1::class1(){ std::cout<<"class1のコンストラクタ"<<std::endl; pointer=new class2(); pointer->aiueo(); //aiueoを~class2に置き換えてもコンパイル出来るが、class2だとエラーが出る } class1::~class1(){ delete pointer; std::cout<<"class1のデストラクタ"<<std::endl; } class2::class2(){ std::cout<<"class2のコンストラクタ"<<std::endl; } class2::~class2(){ std::cout<<"class2のデストラクタ"<<std::endl; } void class2::aiueo(){ std::cout<<"aiueoの実行"<<std::endl; } int main(){ class1 test1; return 0; }
- ベストアンサー
- C・C++・C#
- 違うクラスからの変数の共有化
一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m // 共有化させたい変数を持つクラス // Var.java public class Var{ public static int i; public Var(int i){ this.i = i; } public Var(){} public static void getI(){ return i; } } //クラス1 //Class1.java public class Class1{ Var var = new Var(1); } //クラス2 //Class2.java public class Class2{ Var var = new Var(); System.out.println(var.getI()); } とした場合、Class1を実行し、次にClass2を実行すると、クラス1で定義した変数の値である 1 が戻ってくるようにしたいのですが、上記の方法では、Class2を実行すると結果は 0 になってしまいました。 まだまだ習い始めたばかりでいまいちstaticを使い切れていないと思います・・・ たとえば、PrintStreamクラスの public static final PrintStream out というのはどこから参照しても同じ結果なのでそのようなやり方で大丈夫だろうと思ったのですが・・・ このような方法では共有化させることはできないのでしょうか?またできないのでしたらほかのやり方がもしあった場合は教えていただきたいと思います。 どうかお願いします。
- ベストアンサー
- Java
- C++で継承元のクラスの代入演算子を呼び出す方法
C++であるクラス継承したクラスの代入演算子で 継承元のクラスの代入演算子を呼び出す方法がわかりません。 こんな感じのソースです。 class T { T& operator=(const T &t) { } } class U :: T{ U& operator=(const U &u) { // ここでT.operator=()の代入演算を実行したい } } ((T)(*this)).operator=((T)(u))のようにキャストすればいけるかと思ったんですが、 コンパイルエラーでした。 よろしくお願いします。 また、これはプログラム上好ましくない手法でしたら、 別な実現方法をお教えください。
- ベストアンサー
- C・C++・C#
- クラスから自分のオブジェクトを操作するには
高橋麻奈著の「やさしいJava」を買って、Javaプログラミングをはじめたのですが、どうしても分からないことがあるので質問させてください。 次のようなコードがあります。 class Abc{ public static void main(String arg[]){ Def de = new Def(); de.object_null(); Def de2 = new Def(); de2.object_null(); Ghi gh = new Ghi(); gh.object_null(); } } class Def{ int d,e,f; Abc abc; Def(Abc a,int i1,int i2){ //略 } public void object_null(Abc a){ abc = a; abc.de = null; } } class Ghi extends Def{ Ghi(Abc a,int i1,int i2){ super(a,i1,i2); } } Defクラス側から自分自身のクラス変数deをnullにする場合、public void object_null()メソッドのような方法でクラス変数を指定してnullにしていました。 しかし、この場合、クラス変数de2のobject_null()メソッドではde2をnullできないし、 サブクラスGhiから、クラス変数ghをnullにする場合も、クラス変数deを指定してしまいます。 クラス側から自分自身のクラス変数を指定する良い方法を教えてください。 よろしくお願いします。 #ここは半角スペース無効なんですね(^^;
- ベストアンサー
- Java
- クラスとインスタンスについて
はじめまして。Javaをはじめて3か月の超初心者です。 早速ではございますが、質問をさせていただきます。 以下のサンプルで、 class Foo { private int i = 0; Foo(int i) { this.i = i; } void func1() { System.out.println(this.i); } void func2(Foo foo) { System.out.println(foo.i); } } class Main { public static void main(String[] args) { Foo obj1 = new Foo(100); Foo obj2 = new Foo(500); obj1.func1(); obj1.func2(obj2); } } privateフィールドのスコープは同一クラス内からしか アクセスできないと参考書には記述されているの ですが、そのクラス内に上のサンプルのように this.iやfoo.iというように、クラスは同じでも インスタンスが異なるものがiにアクセスするとき、 上のサンプルは、どちらもアクセス制限のエラーが表 示されません。なぜなのでしょうか? this.iというアクセスは、現在実行中のインスタン ス内でのアクセスなので、privateスコープ内での アクセスであるというような感じがするのですが、 foo.iというアクセスの方は、現在実行中のインスタンスとは異なるインスタンス内でのアクセスなので、 privateスコープからはずれているような感じがして なりません。
- ベストアンサー
- Java
- 抽象クラスとオブジェクトを格納する配列(java)
独習java第4版でわからない所があります。 abstract class Widget { String color; abstract int getMass(); public String toString() { return getClass().getName() + ": " + color + ", " + getMass(); } } class WidgetA extends Widget { final static int MASS = 4; WidgetA(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetB extends Widget { final static int MASS = 1; WidgetB(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetC extends Widget { final static int MASS = 5; WidgetC(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetD extends Widget { final static int MASS = 17; WidgetD(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetTypes { static int NUMWIDGETS = 6; public static void main(String args[]) { // 部品を格納する領域を宣言して割り当てる Widget widgets[] = new Widget[NUMWIDGETS]; // 部品を作成する widgets[0] = new WidgetC("Red"); widgets[1] = new WidgetA("Green"); widgets[2] = new WidgetD("Yellow"); widgets[3] = new WidgetB("Magenta"); widgets[4] = new WidgetA("Black"); widgets[5] = new WidgetC("White"); // 部品を処理する int totalMass = 0; for(int i = 0; i < NUMWIDGETS; i++) { Widget w = widgets[i]; System.out.println(w); totalMass += w.getMass(); } // 総重量を表示する System.out.println("Total mass = " + totalMass); } } これはある問題の解答ですが、僕にはどうしても理解出来ない部分があります。 mainのforループ内で Widget w = widgets[i]; totalMass += w.getMass(); となっています。 この仕組がわかりません。 まず Widget w = widgets[i] でWidget型の変数wにWidget型のwidget[i]を代入しているのにw.getMass()がエラーにならない理由がわかりません。(Widgetクラスは抽象クラスなのにwがWidgetクラスのインスタンスになっている?) これは 抽象メソッド( abstract int getMass() ) があるためでしょうか? ちなみにWidgetクラスとそのサブクラスからこの抽象メソッドを削除したらコンパイルエラーが出ました。 ではなぜ抽象クラスの抽象メソッドから、そのサブクラスのメソッドまで範囲が伸びるのでしょうか? どういう仕組でしょうか? この質問を書きながら思ったのですが、どうも配列の仕組みや抽象クラス・メソッドの仕組み、「オブジェクト」と「インスタンス」の違いがよくわかってないようです。 多分問題の本質はそこにあると思うんです。 駄文で申し訳ないです。 よろしくお願いします。
- ベストアンサー
- Java
- クラスメソッドのみのクラスのオブジェクト生成は不可??
あるテキストのjavaの問題です。 public class Draw{ static void pixel(int x,int y){ /*座標(x、y)に点を描画*/ } static void line(int x1,int y1,int x2,int y2){ /*座標(x1、y1)~(x2、y2)に線を引く*/ } } で、これを実行するための以下のようなクラス public class TestDraw{ <ここに入力> } という問題なのですが2つまでは絞れたのですが、 (1) public static void main(String args[]){ Draw d = new Draw().line(10,10,20,30); } ↑× (2) public static void main(String args[]){ Draw.line(10,10,20,30); } ↑○ (2)はlineメソッドがstaticメソッドだからオブジェクト生成しなくても良い、ということなんですが (1)も正解のような気がするのですが・・・ 解説によると「lineはvoidなのでnew Draw().line(10,10,20,30);とすれば正解、とあります。 どうもいまいち理解できません。 クラスメソッドはオブジェクト生成しなくとも良い→オブジェクト生成できない ということなのでしょうか? それからちなみに、public classって2つ記述できないんではありませんでしたか?
- ベストアンサー
- Java
補足
ありがとうございます。 お手数お掛けします。 VC++は始めたばかりでよくわからない部分もあるのですみません。 因みにVC++では new 使ってインスタンスを作成したことがないのですが、 ポインタを使用するときには必要なのでしょうか? -------------------- : : : myObj objMy; CMapStringToOb objMap; CMapStringToOb* objMap = new CMapStringToOb; -> こんな感じでしょうか? m_combo.GetWindowText(combo); m_edit.GetWindowText(edit); for(i = 0; i < 1 ; i++){ objMy.setIpAdd(edit); objMy.setNetAdd(combo); objMap.SetAt("A", objMy); } : : : : 上記でもエラーが出てしまうのですが・・・・ 素人で大変申し訳ありません。 * CMapStringToObに変更いたしました。