1

指针数组有问题。我有一个名为C的自定义类。C 有一个变量double c1。我必须使用自定义编写的排序算法按 c1 对 Cs 数组进行排序。我猜测由于我必须在数组中移动对象,因此只移动指向对象的指针会更有效,因此我必须使用的不是对象数组,而是指向对象的指针数组。

我像这样初始化数组:

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' 的左边必须指向类/结构/联合/通用类型

我是 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)

所以第二次调用是不正确的。感谢大家的帮助

4

3 回答 3

2

除非你的C对象复制构造真的很昂贵,否则不要费心实现你的自定义排序算法,而是定义一个严格的总顺序C

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

std::sortstd::vector<C>. 如果您确实担心复制构造开销,您也可以直接使用std::set<C>自动排序的 an,而无需复制构造。


编辑后:您的C看起来相对较小且易于复制,但它是边界;您最好的选择是同时提供两种方法 (setvector) 和基准测试哪一种更快。

于 2012-11-21T22:11:58.627 回答
2

撇开哲学不谈,从您的评论中可以看出这一点(强调添加):

“我实际上是在这样的 OnDraw 方法中调用 someC:pDC->MoveTo(someC[i]->a.x, someC->a.y);someC 在头文件中被定义为公共”

具体来说,这在您的参数列表中:

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

这告诉我其中一个是错误的。从你的错误来看,我会选择第一个。如果我们可以看到正在实现的对象的定义OnDraw()以及它的确切someC来源,它将巩固这一点。

  • 如果在您的包含对象中someC是 a C*,则第二个参数是正确的,第一个参数是错误的。
  • 如果someC是 C** 在您包含的对象中,则第一个参数是正确的,第二个参数是错误的。
于 2012-11-21T22:17:34.867 回答
0

如果您的类型只包含 adouble我猜使用指针会快得多!如果对象包含 astd::string或 a std::vector<T>(在一段时间内T),图片可能会发生变化,但与移动具有一个或两个基本对象的结构相比,访问或多或少随机分布的数据的成本相当高。当然,要确定具体情况,您需要分析这两种方法。

于 2012-11-21T22:01:54.703 回答