• 締切済み

クラスのファイル分割について

こんにちは。JavaをやっていましたがC++が必要になってC++を勉強している者です。 クラスを別のファイルに分割する際の書き方についてなのですが、 --Graph.h-- struct edge{ int to, cost; edge(int to,int cost){ this->to = to; this->cost = cost; } } class dijkstra{ public: vector<edge> *G;  ~~~  void set_graph(int N); void add_edge(int a, int b, int cost); ~~~ } ---- --Dijkstra.cpp-- void dijkstra::set_graph(int N){ G = new vector<edge>[N]; } void dijkstra::add_edge(int a,int b,int cost){ G[a].push_back(edge(b,cost)); } ---- としたとき、当方の開発環境のEclipseは「push_backの引数と合わない」といった旨のエラーを出しています。何が悪いのでしょうか。ご教授お願いします。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

手許にあるclang++(3.0)でもまったくエラーになりません。 clang以外で、そんな「赤い下線」なんて出すコンパイラあったかな、と思って 「Invalid arguments Candidates」で検索してみました。 ざっと斜め読みしたところでは、EclipseのCDTのバグというのがありました。 それに該当しませんか?

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.3

vector<struct edge>とか。

回答No.2

egdeにコピー・コンストラクタ/オペレータが定義されていないからじゃないかしら。

tagussann
質問者

補足

ご指摘ありがとうございます。 指摘にあったとおり、 edge(const edge& obj){ this->to = obj.to; this->cost = obj.cost; } edge& operator=(const edge& obj){ this->to = obj.to; this->cost = obj.cost; return *this; } とコピーコンストラクタ、オペレータを定義致しましたが、それでも変わらないようです・・・

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

エラーメッセージは, 正確にはなんと書いてあるのですか? また, 出てくるメッセージはそれだけですか? できれば「同じ問題が起きるなるべく小さなプログラム」を出してほしいんだけどね.

tagussann
質問者

補足

失礼しました。こちらにコードを載せさせて頂きます。 --Graph.h-- #ifndef GRAPH_H_ #define GRAPH_H_ using namespace std; #include <iostream> #include <vector> #include <algorithm> struct edge{ int to,cost; edge(int to,int cost){ this->to = to; this->cost = cost; } }; class dijkstra{ int N; public : vector<edge> *G; int dijkstra_solve(); void set_graph(int N); void add_edge(int from,int to,int cost); }; #endif /* GRAPH_H_ */ ---- --Dijkstra.cpp-- #include <iostream> #include <vector> #include <algorithm> #include "Graph.h" using namespace std; void dijkstra::set_graph(int N){ G = new vector<edge>[N]; } void dijkstra::add_edge(int from,int to,int cost){ G[from].push_back(edge(to,cost)); } ---- 上記のようになっておりまして、push_backに赤い下線が出てきて、 Invalid arguments ' Candidates are: void push_back(const edge &) ' となっております。ご教授よろしくお願いします。

関連するQ&A

  • 下記のc言語のプログラム(LU分解を用いた連立一次方程式)を起動させた

    下記のc言語のプログラム(LU分解を用いた連立一次方程式)を起動させたいのですがエラーがでてしまいます。 どのようにしたら動作しますか? #include <stdio.h> #include <stdlib.h> #include <float.h> #define MAX_DIM 10 #define MIN_DIM 1 int get_dimension(int, int); double *get_matrix( int ); double *get_vector( int ); void set_matrix( int, double* ); void set_vector( int, double* ); void LU( int, double*, double*, double* ); void L_equ( int, double*, double*, double* ); void U_equ( int, double*, double*, double* ); void pr_vector( int, double* ); void matrixcpy( int, double*, double* ); void make_I( int, double* ); void main( void ) { int n , i ; double *A, *b ; double *L, *U ; double *c, *x ; n = get_dimension( MAX_DIM, MIN_DIM ); if( ( A = get_matrix( n ) ) == (double *) NULL || ( L = get_matrix( n ) ) == (double *) NULL || ( U = get_matrix( n ) ) == (double *) NULL || ( b = get_vector( n ) ) == (double *) NULL || ( c = get_vector( n ) ) == (double *) NULL || ( x = get_vector( n ) ) == (double *) NULL ) { fprintf( stderr, "メモリ所得エラーです!!\n" ); } else { set_matrix( n, A ); set_vector( n, b ); LU( n, A, L, U ); L_equ( n, L, c, b ); U_equ( n, U, x, c ); printf( "解は、" ) ; pr_vector( n, x ) ; } }

  • コンパイルエラーについて

    関数 y=x と y=x*x/8 のグラフをテキストで描くプログラムなのですが、cygwinでコンパイルすると次のエラーが出ます。何を直せばいいのか教えてください。 /tmp/cceveo7s.o:week2.c:(.text+0x62): undefined reference to `_f' /tmp/cceveo7s.o:week2.c:(.text+0xb1): undefined reference to `_f' /tmp/cceveo7s.o:week2.c:(.text+0xbd): undefined reference to `_g' collect2: ld はステータス 1 で終了しました ソースプログラムはこちらです。 #include <stdio.h> #define XSIZE 20 #define YSIZE 20 char graph[XSIZE][YSIZE]; /* 座標(x, y)に文字cをプロットする */ void f(int x, int y, char c); /* 作成したグラフを表示する */ void g(void); int main(void){ int x, y; for (x=0;x<XSIZE;x++){ y = x; f(x, y, '+'); } for (x=0 ; x < XSIZE ; x++){ y=x*x/8 ; f(x, y, '*'); if(y>=YSIZE) break; g(); return 0; } void f(int x, int y, char c) { graph[x][y] = c; } void g(void) { int a, b; for (b=YSIZE ; b>0 ; b--){ for (a = 0 ; a < XSIZE ; a++){ if (graph[a][b]==0) printf(" "); else printf("%c ", graph[a][b]); } printf("\n"); } } return 0; }

  • 2次元配列にポインタを格納

    http://www.okweb.ne.jp/kotaeru.php3?q=505241の訂正版の質問です。 VC++6.0を使っております。 下のようなプログラムを作ってみました。 #include <stdio.h> #include <vector> using namespace std; class c{ public: c(); virtual ~c(); int get(){return j;}; void set(int i){j=i;}; private: c(const c &right); const c &operator=(const c &right); int j; }; void main(){ vector <vector<c*> > a; c *b; for(int n=0;n<10;n++){ for(int i=0;i<10;i++){ b=new c; a[n].push_back(b); } } for(int j=0;j<10;j++){ for(int i=0;i<9;i++){ a[i][j] -> set(i+j); } } for(j=0;j<10;j++){ for(int i=0;i<9;i++){ printf("%d ",a[i][j] -> get()); } printf("%d\n",a[9][j] -> get()); } for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ delete a[i][j]; } } } すると、コンパイルには成功するのですが、実行は出来ません。 その理由は、「外部参照1が未解決」だそうです。 アドバイスをお願いいたします。

  • C#クラスについて教えてください

    下記通りクラスを作成した場合、プロパティaを配列にできますか? class Class1 { public string a { set; get; } public int b { set; get; } public int c { set; get; } } イメージとしては下記通りにしたいのですが、なかなかうまく行きません。 class Class1 { public Class1(int x) { } public string a[x] { set; get; } public int b { set; get; } public int c { set; get; } } private void Form1_Load(object sender, EventArgs e) { Class1 f = new Class1(2); f.a[0] = "asdf"; f.a[1] = "asdfa"; f.a[2] = "asdfasd"; f.b = 1; f.c = 2; } 初心者なんで、やさしく教えてください。お願いします。

  • C言語の質問です。

    #include"stdio.h" int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = a+b; printf("add=%d\n", add); return 0; } と、------------------------------------------------------------------------------ #include"stdio.h" int tasizan(int x, int y); int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = tasizan(a, b); printf("add=%d\n", add); return 0; } int tasizan(int x, int y){ int aa; aa = x + y; return aa; } の違いを教えてください。

  • C++ STL vectorの使い方

    こんばんは。 C++のstd::vectorに関する質問です。 vectorをポインタ渡しにしたときに メンバにアクセスする方法を知りたいのですが・・・ 以下ソースの☆の部分をどう記述したらよいでしょう? #include <vector> typedef struct test {  char name[10];  char id[2]; } TEST; void funcVectorTest( std::vector<TEST> *a); int main(){  std::vector<TEST> a;  int i;  TEST foo= {"Taro","0"};  a.push_back(foo);  printf("%s",a[0].name);  a.push_back(foo);  printf("%s",a[1].name);  funcVectorTest(&a);//vectorのアドレス渡しテスト  printf("%s", a[2].name);//vectorのアドレス渡し確認  return 0; } void funcVectorTest( std::vector<TEST> *a) {  int i;  int cnt;  TEST *b;  b = new TEST[3];  TEST foo= {"Taro","0"};  a->push_back(foo);  cnt = a->size();  for( i = 0; i < cnt;i++){  //以下でa[i]のnameにアクセスしたいのですがうまくいっていません。  //☆strcpy( b[i].name, a[i]->name );  }  delete[] b; } お分かりになる方、お知恵をお貸し下さい(><) vectorについて最近知ったばかりでいまいち使い方が 分かっていない部分があるので このやり方がまずいということであれば教えていただけると 助かります。 よろしくお願いしますm( _ _ )m

  • ポインタ

    C言語のポインタの勉強をしています。//エラー と書いている行でエラーがでます。*(a++),*(b++),*(c++)をそれぞれ*(a+i),*(b+i),*(c+i)とすればエラーがなくなるのですが、違いがわかりません。 先頭アドレスをセットしてないからエラーが出たのかと思いましたが、それが原因なら*(a+i),*(b+i),*(c+i)でエラーがなくなるのはどうしてでしょうか? 違いを教えて下さい。よろしくお願いします。 #include<stdio.h> int main(void) { void p_add(int *a, int *b, int *n); int i; int a[10] = {3,7,1,2,8,9,0,4,6,5}; int b[10] = {7,3,9,8,2,1,10,6,4,5}; int c[10]; memset(c,0x00,sizeof(c)); p_add(a, b, c); for(i = 0; i < 10; i++){ printf("a[%d]=%d b[%d]=%d c[%d]=%d\n", i, *(a++), i, *(b++), i, *(c+ +));                                               // エラー } return 0; } void p_add(int *a, int *b, int *n){ int i; for(i = 0; i < 10; i++){ *(n++) = *(a++) + *(b++); } }

  • クラス→スタックを使う

    初歩的なとこですがすでに着いていけず困っています。 問題は、  下記のプログラムにおいて、スタックへ整数10を入れるには、push(10)としてメソッドpushを呼び出す。逆に、スタックから値を取り出すには、pop()メソッドを呼び出す。また、現在のスタックの先頭位置(スタックポインタsp)は、メソッドgetSP()を呼び出すことで得られる。今、整数10と20をこの順にスタックへ入れた後、スタックから先頭の要素(整数)を取り出す。ただし、取り出した値は出力する必要はない。そして、これらの操作(3回ある)が終わる毎に、その時のスタックポインタspの値を出力する。  このような動作をするようにmainメソッドを完成させ、実行結果を確かめなさい。 class Stack { int [] stack = new int[10]; int sp = 0; void push(int n){ if(sp < stack.length){ stack[sp] = n; sp++; } } void pop(){ if(sp > 0)sp--; } int getSp(){ return sp; } public static void main(String[] args){ // <この部分を完成させなさい> } } 宜しくお願いします!!  

    • ベストアンサー
    • Java
  • synchronizedが解りません。

    synchronized( a ) { a.add(); } ブロック文で aオブジェクトをロックしてるはずなんですが 結果を見ると出来てないようです なぜうまくいかないんでしょうか? 教えてください。 class Test extends Thread { feet a = new feet(); public static void main( String args[] ){ for( int i = 0; i < 3; i++ ){ Test b = new Test(); b.start(); } } public void run() { synchronized( a ) { a.add(); } } } class feet{ int n, m; void add(){ n++; System.out.println( n + " " + m ); try { Thread.sleep( 1000 ); }catch( InterruptedException err ){ } m++; System.out.println( n + " " + m ); } }

    • ベストアンサー
    • Java
  • LKMの分割コンパイルについて

    こんばんは、自分は今LKMの分割コンパイルに挑戦しています。 以下のようなファイルを作成して、モジュールを作ってみました。 [Makefile] obj-m := message.o message-objs := message.o sample_func.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: rm -f *.o *.ko *.symvers *~ *.mod.c [message.c] #include <linux/module.h> #include <linux/kernel.h> #include "sample_func.h" static char *msg = "[message.o]:"; static int message_module(void) { printk(KERN_INFO "%s loaded\n",msg); printk(KERN_INFO "%s %d\n", msg, sample_add(2,3)); return 0; } static void message_remove(void) { printk(KERN_INFO "%s removed\n", msg); } module_init(message_module); module_exit(message_remove); [sample_func.c] #include "sample_func.h" static int inner_add(int,int); int sample_add(int a, int b) { return inner_add(a,b); } static int inner_add(int a, int b) { return a+b; } [sample_func.h] int sample_add(int,int); コンパイルは正しく通るようなのですが、/var/log/messages に何も出力がありません。 (KERN_INFOを指定しているので/var/log/messagesに出力されると思っているのですが。。。) lsmodで確認したところ、モジュールはカーネル内に正常に組み込まれているようでした。 どなたか解決方法をご存知の方教えていただけないでしょうか。 宜しくお願いします。