• 締切済み

定義の曖昧さで問題?コンストラクタ呼び出しでエラー

コンストラクタの呼び出しでエラーが出てしまいます! 問題のコンストラクタの定義位置を見るとなぜか2件検出されるので、 それが原因かなと思ってます。 エラーが出るのは下の ImpBrush::c_pBrushes[BRUSH_CIRCLES] = new CircleBrush( this, "Circles" ); のところです。 ImpressionistDoc::ImpressionistDoc() { (略) ImpBrush::c_pBrushes[BRUSH_POINTS ] = new PointBrush ( this, "Points" ); ImpBrush::c_pBrushes[BRUSH_TRIANGLES] = new TriangleBrush( this, "Triangles" ); ImpBrush::c_pBrushes[BRUSH_CIRCLES ] = new CircleBrush( this, "Circles" );←構文エラー! (略) } また、定義の検出される先は、一方は呼び出してほしいコンストラクタ、もう一方はなぜかCircleBrushクラスそのものなのです。 非常におかしいことになってます。 ↓定義位置として正しい箇所 CircleBrush::CircleBrush( ImpressionistDoc* pDoc, char* name ) : ImpBrush(pDoc,name) { } class CircleBrush : public ImpBrush ←なぜかここも定義位置として呼び出される { public: CircleBrush( ImpressionistDoc* pDoc = NULL, char* name = NULL ); void BrushBegin( const Point source, const Point target ); void BrushMove( const Point source, const Point target ); void BrushEnd( const Point source, const Point target ); char* BrushName( void ); }; 他のPointBrush、TriangleBrushではこれは起こりませんでした。CircleBrushのみです。 一向に前に進めません! 何が原因でしょうか? C++のバグでしょうか?

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

使っている処理系は何ですか? どんなエラーメッセージが出ていますか (「構文エラー」ではないはず. 出ているエラーメッセージを一切解釈することなくそのまま書いてください)?

itori00
質問者

お礼

回答ありがとうございます! それで申し訳ないのですが、自己解決しました。 単なるヘッダのインクルードし忘れでした。 ご迷惑おかけしました・・・

関連するQ&A

  • コンストラクタ内で定義したインスタンスの呼び出し。

    以下のようなソースを書いてみたのですが、 コンストラクタで定義したインスタンスehogeを set_vのところで使おうとすると”ehogeを解決できません” というエラーが出てしまいます。 初歩的な質問ですが、 ehogeをコンストラクタ外でも使えるようにするにはどうすればいいのでしょうか? public class sample { void sample(){ hoge ehoge=new hoge(); } public static void main(String[] args) { } void set_v(){ int num=ehoge.value(); } } class hoge{ int value=1; }

    • ベストアンサー
    • Java
  • コンストラクタのオーバーロードについて

    class loo{ //フィールドの定義 int sland; //コンストラクタの定義1 loo(){ this.sland = 28; } //コンストラクタの定義2 loo(int sland){ this.sland = sland; } //メソッドの定義 void ken(){ System.out.println(this.sland); } } //mainメソッド class kkk{ public static void main(String args[]){ ---------------------------------------------- loo lo = new loo(); lo.ken(); lo.ken(100); ---------------------------------------------- } } コンストラクタのオーバーロードについて、伺いたいことがありますので掲載致しました。 今回は、kenメソッドを用いて変数slandに入っている値を表示するプログラムを作りたいと思っています。 コンストラクタのオーバーロードを利用するわけですが、プログラム実行後に 28 100 という風な出力結果を得ようと、上記のようなプログラミングを実施しました。 しかし、いざコンパイルをかけると java:27: ken() (loo 内) を (int) に適用できません lo.ken(100); ~ というエラーが表示されてしまいます。 ----でかっこってある部分に問題があるのはわかっているのですが、思うように結果を得ることができない状況です。 また、----の部分を、 loo lo = new loo(100); lo.ken(); lo.ken(); と、書き換えると出力結果は 100 100 と表示され、28が表示されなくなってしまいます。 お手数ですが、ご教授の程お願い致します。

  • コンストラクタの中でメンバクラスをnewしてはだめなのですか?

    C#2008EXPRESS EDITIONです。 以下のようなソースで、★1ではT.aがちゃんと生成されてるのに、★2のようにすると、Tの各メンバがNULLになってしまいます。 こういうやり方は、だめなのでしょうか?デバッガでは、引数無しのコンストラクタの内容を実行しているようなのですが・・・ なお、当方はCは理解していますが、C++を随分前に落伍した程度の者で、今回C#に挑戦してみようとしています。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { public class point { public double x; public double y; public point(double a, double b) { x = a; y = b; } } public class Triangle { public point a; public point b; public point c; public Triangle() { point a = new point(0,0); point b = new point(0,0); point c = new point(0,0); } public Triangle(point a,point b,point c){ this.a = a; this.b = b; this.c = c; } } static void Main(string[] args) { ★1 Triangle T = new Triangle(new point(1,2),new point(3,4),new point(5,6)); ★2 Triangle T = new Triangle(); Console.WriteLine("T.a.x={0} T.a.y={1}",T.a.x,T.a.y); } } } すみません、インデントを付ける方法がわからなくて、見にくいソースになってしまって。

  • コンストラクタと静的メソッドを簡単に定義する

    立て続けに質問することをお許し下さい。。 以下のようなPersonクラスがあるとします。 /**** Person クラス(全角スペース表記) ****/ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <HTML>  <HEAD>   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">   <META HTTP-EQUIV="Content-Script-Type" CONTENT="javascript">   <TITLE>教えて!gao</TITLE>   <SCRIPT TYPE="text/javascript">    function Person(name, age, sex, color) {     this.name = name;     this.age = age;     this.sex = sex;     this.color = color;    }    Person.prototype = {     name:null,     age:null,     sex:null,     color:null    };    Person.YELLOW = "黄色人種";    Person.BLACK = "黒色人種";    Person.WHITE = "白色人種";    function test() {     var person = new Person("ggaogg", 23, "male", Person.YELLOW);     var resultBlock = document.getElementById("resultBlock");     for (property in person) {      resultBlock.appendChild(document.createTextNode(property + " = " + person[property]));      resultBlock.appendChild(document.createElement("BR"));     }    }   </SCRIPT>  </HEAD>  <BODY ONLOAD="test()">   <DIV ID="resultBlock"></DIV>  </BODY> </HTML> /********************************************************/ これの実行結果は、以下の通りです。 name = ggaogg age = 23 sex = male color = 黄色人種 しかし、静的変数を、毎回「Person.」を付けて記述するのは面倒で、すべて{}でひとくくりになっていたほうが可読性も増すと思い、以下のようにできると思いましたが、そうしたところ new Person("ggaogg", 23, "male", Person.YELLOW); の部分がコンストラクタではないというようなエラーとなってしまいます。(Web等でこの書き方はあまり見かけないが自分は気に入っている) /************ 変更した部分 ******************/ Person = { YELLOW : "黄色人種", BLACK : "黒色人種", WHITE : "白色人種" }; /********************************************/ 多分、初めに行ったコンストラクタの定義とこの{}の定義とが競合しているためだと思うのですが、何かよい書き方ありませんでしょうか。

  • C++の問題で・・

    C++の問題で・・ 参考書に「簡易的な文字列クラスStringを作成せよ。」という問題があり作りました。 いかにそのコードを示します。今回の質問の内容に関係ないとおもうところや、インクルードなどは省かせていただきます。 環境は Visual studio 2008です。OSはXPです。 class String{     int len; //文字列の長さ     char *s; //文字列の先頭文字へのポインタ public:     String(const char *);     int length()const{return len;} //長さを求める     operator const char * ()const{return s;}     bool operator==(String &a)const{return strcmp(this->s, a);}     char *operator+(String&)const; }; char * String::operator +(String &a)const {     char *memory = new char[this->len + a.len + 1];     memory[0] = '\0';     return strcat(strcat(memory, this->s), a); } String::String(const char *p): s(const_cast<char *>(p)), len(strlen(p)){} String::String(const String &x) {     s = x.s;     len = x.len; } inline std::ostream& operator<<(std::ostream &s, String &x) {     return s << static_cast<const char *>(x); } int main() {     String a("My name is Paul");     String b("My name is Paul");     String c("My name");     String d(" is Paul");     cout << "a = " << a << "\n";     cout << "b = " << b << "\n";     cout << "c = " << c << "\n";     cout << "d = " << d << "\n";     cout << "a == b " << (a == b) << "\n";     cout << "a == c " << (a == c) << "\n";     cout << "c + d = " << (c + d) << "\n"; }     このようなプログラムなのですが、上記の char * String::operator +(String &a)const {     char *memory = new char[this->len + a.len + 1];     memory[0] = '\0';     return strcat(strcat(memory, this->s), a); } ところで、 memory[0] = '\0'; を除くと文字列を出力した結果をみると、先頭にいらない言葉が入っています。 僕の場合は x9My name is Paul と表示されます。文字化け・・ではないのですが、ゴミのようなものが・・ どうしてこのようなことが起こるか、どこでゴミが入ってしまうのか教えてほしいです。 稚拙なプログラムで申し訳ないです。 もし、間違っている場所や、もっと簡単にかけるようなところがあれば、ご指摘いただくとありがたいです。 よろしくお願いします!

  • コンストラクタ

    public ref class Himoku_Data : public System::ComponentModel::Component { //フィールド private: array<System::String ^>^ Data; public: Himoku_Data(void) { // //TODO: ここにコンストラクタコードを追加します // this->Data = {"a","b","c","d",}; InitializeComponent(); } error C2059: 構文エラー : '{' h(26) : error C2143: 構文エラー : ';' が '{' の前にありません。 h(26) : error C2059: 構文エラー : '}' コンストラクタ作成でthis-Dataの行にエラーが出てしまいます。 原因がよくわからないのでおしえてください。

  • 今,C++のコンストラクタを勉強しているのですが,これの働きと役割がい

    今,C++のコンストラクタを勉強しているのですが,これの働きと役割がいまいちわかりません class const{ public: int a; const(); } const::const() { a = 100; } int main() { const c; cout << " c.a = " << c.a << endl; return 0; } この様な例がのっていたのですが、[const c;]は何を定義しているのでしょうか, [c.a]はどの変数のことをさしているのでしょうか?教えてください。

  • アプレットが開始しないエラーについて

    今Javaで「1」のキーを押すと、現在表示されている画像が変わるアプレットを作っています。 書いたプログラムは以下です。 import java.applet.*; import java.awt.*; import java.awt.event.*; import java.lang.String; class Gazou extends Applet { private Image pic[] = new Image[3]; private int stat,stat2; private char pushkey; public Gazou(String name1, String name2, String name3, char c1) { this.stat=0; this.pic[0] = getImage(getDocumentBase(),name1); this.pic[1] = getImage(getDocumentBase(),name2); this.pic[2] = getImage(getDocumentBase(),name3); this.pushkey = c1; } public Image GetPicture(char n) { if(pushkey == n) { if(this.stat == 0) this.stat = 1; this.stat2=0; if(this.stat == 1) this.stat = 2; this.stat2=1; if(this.stat == 2) this.stat = -1; this.stat2=2; } return this.pic[this.stat2]; } } public class ImageView extends Applet implements KeyListener { char flg; Gazou data = new Gazou("1-1.JPG","1-2.JPG","a.JPG",'1'); public void init() { addKeyListener(this); } public void paint(Graphics g) { if(flg == '1') g.drawImage(data.GetPicture(flg),0,0,this); } public void keyPressed(KeyEvent e) { flg = e.getKeyChar(); repaint(); } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} } 1-1.JPG,1-2.JPG,a.JPGはソースファイルと同じディレクトリに保存してあります。 NullPointerExceptionが出てるので代入ミスなのかと思っているのですが、どこを直したらよいかわかりません。 どなたか分かる方ご教授おねがいします。 エラーメッセージは別に示します。

    • ベストアンサー
    • Java
  • ユーザー定義オブジェクト

    現在、ユーザー定義オブジェクトについて勉強しています。 以下は本からの抜粋です。 //コンストラクタを定義する。 //thisで参照するオブジェクトの初期化法に注目   function Rectangle(w,h) { this.width=w; this.height=h; } //コンストラクタを呼び出して2つの長方形オブジェクトを生成する。 //widthとheightをコンストラクタに渡して、それぞれの新しい //オブジェクトを適切な形で初期化するやり方に注目 var rect1=new Rectangle(2,4); var rect2=new Rectangle(8.5,11); ★質問★ this.width=w; this.height=h; var rect1=new Rectangle(2,4); var rect2=new Rectangle(8.5,11); この2箇所で行っている「初期化」という作業の意味がよく分かりません。 また、ユーザー定義オブジェクトの概念についていまいちイメージ がつかめていません(特にthisとnewを使用している意図など) ご教授いただきたく、よろしくお願いします。

  • プログラム問題(4)

    以下の問題のプログラムをやったのですが、コマンドプロンプトで実行してみるとエラーになってしまうのですが、どなたか問題点を指摘していただけないでしょうか? 【問題】 学籍番号、氏名、出席からなる10人分のデータがある。出席の悪いものから並び替  えて表示するプログラム。  例  CA180002 山田太郎 70  CA170001 山田次郎 60  データは、適当なものを使います。 【プログラム】 #include <stdio.h> #include <string.h> typedef struct student_t { char id[9]; char name[51]; unsigned int attendance; } student; student stu[10]; int stu_i = 0; void student_new(const char *, const char *, unsigned int); void student_sort(void); int main(void) { int i; student_new("5", "宮本恒靖", 5); student_new("14", "三都主アレサンドロ", 1); student_new("21", "加地亮", 9); student_new("22", "中澤佑二", 6); student_new("7", "中田英寿", 2); student_new("8", "小笠原満男", 8); student_new("10", "中村俊輔", 7); student_new("15", "福西崇史", 3); student_new("9", "高原直泰", 4); student_new("13", "柳沢敦", 0); student_sort(); for (i = 0; i < stu_i; ++i) { printf("%s %s %d\n", stu[i].id, stu[i].name, stu[i].attendance); } } void student_new(const char *id, const char *name, unsigned int att) { strcpy(stu[stu_i].id, id); strcpy(stu[stu_i].name, name); stu[stu_i].attendance = att; stu_i++; } void student_sort(void) { int i, j; student tmp; for (i = 0; i < stu_i; ++i) { for (j = i + 1; j < stu_i; ++j) { if (stu[i].attendance > stu[j].attendance) { tmp = stu[i]; stu[i] = stu[j]; stu[j] = tmp; } } } }

専門家に質問してみよう