1

ポインターの配列に問題があります。Cというカスタム クラスがあります。C には変数double c1があります。カスタム作成された並べ替えアルゴリズムを使用して、C の配列を c1 で並べ替える必要があります。オブジェクトを配列で移動する必要があるため、ポインターをオブジェクトに移動するだけの方がはるかに効率的であると推測しているため、オブジェクトの配列ではなく、オブジェクトへのポインターの配列を使用する必要があります。

そのように配列を初期化しました:

C** someC;
someC = new C*[size];
for(int i = 0; i < size; i++) {
    // a and b are of type CPoint
    someC[i] = new C(a,b);
}

この部分を正しく行っていますか?問題を引き起こすのは C オブジェクトの呼び出しです。

someC[i]->a.x

エラーが表示されます: '->a' の左側は、class/struct/union/generic 型を指している必要があります

私は C++ を初めて使用するので、明らかな何かが欠けている可能性がありますが、いくつかの調査を行ったところ、何も見つかりませんでした。たぶん、ポインタの仕組みをよく理解していない...


アップデート

C クラスのヘッダー ファイル:

#pragma once

class C
{
public:
    CPoint a;
    CPoint b;
    double c1;
    C(void);
    C(CPoint,CPoint);
    ~C(void);
};

実装:

#include "StdAfx.h"
#include "C.h"
#include <math.h>

C::C(void)
{
}

C::C(CPoint a, CPoint b)
{
    this->a=a;
    this->b=b;

    double c1_x = a.x - b.x;
    double c1_y = a.y - b.y;
    c1= sqrt( (c1_x * c1_x) + (c1_y * c1_y));
}

C::~C(void)
{
}

アップデート

問題はコメントで提供したコードにありました。次のように間違った方法で配列を呼び出していることに気づきませんでした。

pDC->MoveTo(someC[i]->a.x, someC->a.y)

したがって、2 番目の呼び出しは正しくありませんでした。ご協力ありがとうございました

4

3 に答える 3

2

Cオブジェクトのコピー構成に本当に費用がかかる場合を除いて、カスタムソートアルゴリズムを実装する必要はありませんが、厳密な全順序を定義してくださいC

bool operator<(C const& lhs, C const& rhs) {
  return lhs.c1 < rhs.c1;
}

で使用std::sortしますstd::vector<C>。コピー構築のオーバーヘッドが心配な場合は、コピー構築を行わずstd::set<C>に、自動的に自動的にソートされるanを直接使用することもできます。


編集後:あなたCは比較的小さくてコピーしやすいように見えますが、それは境界線です。あなたの最善の策は、どちらが速いかというアプローチ(setと)とベンチマークの両方を与えることです。vector

于 2012-11-21T22:11:58.627 に答える
2

哲学は別として、これはあなたのコメントからかなりわかります(強調を追加):

「私は実際にそのような OnDraw メソッドで someC を呼び出しています: pDC->MoveTo(someC[i]->a.x, someC->a.y);someC はヘッダーファイルで public として定義されています」

具体的には、これをパラメーター リストに含めます。

someC[i]->a.x, someC->a.y

これは、これらのいずれかが間違っていることを示しています。あなたの間違いから判断すると、私は最初のものに行きます。OnDraw()実装しているオブジェクトの定義と、それがどこから取得されているかを正確に確認できれば、それが固まりますsomeC

  • someCが含まれているオブジェクトにある場合C*、2 番目のパラメーターは正しく、最初のパラメーターは間違っています。
  • 含まれているオブジェクトの が C** の場合someC、最初のパラメーターは正しく、2 番目のパラメーターは間違っています。
于 2012-11-21T22:17:34.867 に答える
0

あなたの型に a だけが含まれている場合は、ポインターを使用しないdouble方がはるかに高速だと思います! オブジェクトに aまたは a (しばらくの間) が含まれている場合、状況はおそらく変化しますが、1 つまたは 2 つの基本オブジェクトを含む構造を移動する場合と比較すると、多かれ少なかれランダムに分散されたデータにアクセスするコストはかなり高くなります。もちろん、特定の状況を判断するには、両方のアプローチをプロファイルする必要があります。std::stringstd::vector<T>T

于 2012-11-21T22:01:54.703 に答える