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

C++ array of pointers - initializing and accessing objects

本文关键字:访问 对象 初始化 指针 数组 C++      更新时间:2023-10-16

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

我这样初始化数组:

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)

所以第二次呼叫是错误的。感谢大家对的帮助

撇开哲学不谈,这从你的评论中很有说服力(强调):

"我实际上在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**,则第一个参数是正确的,第二个参数是错误的

除非C对象的复制构造真的很昂贵,否则不要麻烦实现自定义排序算法,而是在C:上定义严格的总顺序

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

并且在CCD_ 10上使用CCD_。如果您确实担心复制构造开销,您也可以直接使用std::set<C>,它会自动对自己进行排序,而不需要复制构造。


编辑后:您的C看起来相对较小且易于复制,但它处于临界状态;您最好同时给出两种方法(setvector),并确定哪种方法更快。

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