C ++指针数组 - 初始化和访问对象

时间:2012-11-21 21:47:19

标签: c++ arrays pointers

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

我像这样初始化了数组:

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

给我一​​个错误:' - &gt; 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)

所以第二次通话不正确。谢谢大家的帮助

3 个答案:

答案 0 :(得分:2)

除非你的C对象复制构造真的非常昂贵,否则不要费心实施自定义排序算法,而是定义严格的总订单超过C

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

并在std::sort上使用std::vector<C>。如果您确实担心复制构建开销,您也可以直接使用std::set<C>自动排序,不用复制构建。


编辑后:您的C似乎相对较小且易于复制,但它是边缘线;你最好的选择是给出两种方法(setvector)和基准哪一种更快。

答案 1 :(得分: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*,则第二个参数是正确的,第一个参数是错误的。
  • 如果someC在您包含的对象中是C **,那么第一个参数是正确的,第二个参数是错误的。

答案 2 :(得分:0)

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