クラスを配列化して operatorでベクトル演算させたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tim
記事: 5
登録日時: 12年前

クラスを配列化して operatorでベクトル演算させたい

#1

投稿記事 by tim » 11年前

演算子の多重定義でベクトルの足し算を行うプログラムを作っています。 単純に足し算させる事は出来たのですがベクトルを要素に持つ配列を作る事は出来ますが足すことが出来ません(コンパイルは出来ますが値が変わらない) 
おそらく 配列化 vec2 a[3]とすると引数がない関数が呼び出されてるのが原因だと思うのですが、どうすれば配列化したクラスを足すプログラムを実現させる事ができるのか分かりません どうすればよいでしょうか?

コード:

#include<iostream>

class vec2{
public:
	vec2();
	vec2(int x,int y);

	vec2 operator+(const vec2 &obj);
	
	void set(int x,int y);

	int getx(void){return m_x;}
	int gety(void){return m_y;}

private: 

	int m_x;
	int m_y;
	

};

vec2::vec2(void){
	m_x=0;
	m_y=0;
}

vec2::vec2(int x,int y){
	set(x,y);
}

void vec2::set(int x,int y){
	m_x=x;
	m_y=y;
}

vec2 vec2::operator+(const vec2 &obj){
	vec2 tmp;
	tmp.m_x=m_x+obj.m_x;
	tmp.m_y=m_y+obj.m_y;

	return tmp;
}

int main(){
	using namespace std;
	vec2 a1(2,2);
	vec2 a2(1,3);
	vec2 a3(0,0);
	vec2 b[3]={a1,a2,a3};
	cout<<"a2("<<a2.getx()<<" "<<a2.gety()<<")"<<endl;
	cout<<"b[0]("<<b[0].getx()<< " "<<b[0].gety()<<")"<<endl;
	b[0]+a2=a2;
	cout<<"b[0]+a2=a2("<<a2.getx()<<" "<<a2.gety()<<")"<<endl;//足せてない
	
	cout<<"a1("<<a1.getx()<<","<<a1.gety()<<")"<<endl;
	cout<<"a2("<<a2.getx()<<","<<a2.gety()<<")"<<endl;
	cout<<"a3("<<a3.getx()<<","<<a3.gety()<<")"<<endl;
	a3=a1+a2;
	cout<<"a1+a2=a3("<<a3.getx()<<","<<a3.gety()<<")"<<endl;//こちらは足せている

	getchar();
	return 0;
}

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: クラスを配列化して operatorでベクトル演算させたい

#2

投稿記事 by usao » 11年前

どういうことに困っているのかいまいちわからないのですが
53行目を単純にタイプミスされているのではありませんか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: クラスを配列化して operatorでベクトル演算させたい

#3

投稿記事 by みけCAT » 11年前

C/C++ to Assemblyを利用して解析したところ、

コード:

b[0]+a2=a2;
の部分に相当するコードは以下のようになっていました。

コード:

01f0 488D55C0 		leaq	-64(%rbp), %rdx
01f4 488D4590 		leaq	-112(%rbp), %rax
01f8 4889D6   		movq	%rdx, %rsi
01fb 4889C7   		movq	%rax, %rdi
01fe E8000000 		call	_ZN4vec2plERKS_
     00
0203 488945E0 		movq	%rax, -32(%rbp)
0207 488B45C0 		movq	-64(%rbp), %rax
020b 488945E0 		movq	%rax, -32(%rbp)
また、vec2::operator+に相当するコードは以下のようになっていました。

コード:

             	_ZN4vec2plERKS_:

             	.LFB975:

             		.cfi_startproc
006c 55       		pushq	%rbp

             	.LCFI15:

             		.cfi_def_cfa_offset 16
             		.cfi_offset 6, -16
006d 4889E5   		movq	%rsp, %rbp

             	.LCFI16:

             		.cfi_def_cfa_register 6
0070 4883EC20 		subq	$32, %rsp
0074 48897DE8 		movq	%rdi, -24(%rbp)
0078 488975E0 		movq	%rsi, -32(%rbp)

             	.LBB4:

007c 488D45F0 		leaq	-16(%rbp), %rax
0080 4889C7   		movq	%rax, %rdi
0083 E8000000 		call	_ZN4vec2C1Ev
     00

0088 488B45E8 		movq	-24(%rbp), %rax
008c 8B10     		movl	(%rax), %edx
008e 488B45E0 		movq	-32(%rbp), %rax
0092 8B00     		movl	(%rax), %eax
0094 01D0     		addl	%edx, %eax
0096 8945F0   		movl	%eax, -16(%rbp)

0099 488B45E8 		movq	-24(%rbp), %rax
009d 8B5004   		movl	4(%rax), %edx
00a0 488B45E0 		movq	-32(%rbp), %rax
00a4 8B4004   		movl	4(%rax), %eax
00a7 01D0     		addl	%edx, %eax
00a9 8945F4   		movl	%eax, -12(%rbp)

00ac 488B45F0 		movq	-16(%rbp), %rax

             	.LBE4:

00b0 C9       		leave
下のgetx,getyに相当するコードより、-64(%rbp)がa2に相当するようです。
ここから、a2の値は更新されていないことがわかります。

(なぜか変換されたコード全体を張ると記事全体が表示されなくなった)

また、

コード:

cout<<"b[0]+a2=a2("<<(b[0]+a2).getx()<<" "<<(b[0]+a2).gety()<<")"<<endl;
とすると、普通に足し算できるようです。
オフトピック
このコード、左辺値が必要とか言われないんですね。驚きです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

tim
記事: 5
登録日時: 12年前

Re: クラスを配列化して operatorでベクトル演算させたい

#4

投稿記事 by tim » 11年前

これはすごい基本的な事について間違いを犯していました。 どうもすみません

>このコード、左辺値が必要とか言われないんですね。驚きです。

びっくりですね 

閉鎖

“C言語何でも質問掲示板” へ戻る