Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指针的C++数组——初始化和访问对象_C++_Arrays_Pointers - Fatal编程技术网

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

指针的C++数组——初始化和访问对象,c++,arrays,pointers,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

指针数组有问题。 我有一个名为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);
}
给我一个错误:'->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)
{
}

所以第二个电话是不正确的。谢谢大家的帮助

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

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

除非您的C对象复制构造非常昂贵,否则不要费心实现自定义排序算法,而是定义C上的严格总顺序:

并在一台计算机上使用。如果您确实担心复制构造开销,那么还可以直接使用自动排序的,无需复制构造

编辑后:你的C看起来相对较小,很容易复制,但它的边界;最好的办法是给出方法集和向量以及基准,哪一种更快。

除非复制构造C对象的成本非常高,否则不要费心实现自定义排序算法,而是在C上定义一个严格的总顺序:

并在一台计算机上使用。如果您确实担心复制构造开销,那么还可以直接使用自动排序的,无需复制构造


编辑后:你的C看起来相对较小,很容易复制,但它的边界;你最好的办法是给出两种方法集和向量以及基准,哪一种更快。

撇开哲学不谈,从你的评论中可以看出这一点:


我实际上在OnDraw方法中调用someC,如下所示:pDC->MoveTosomeC[I]->a.x,someC->a.y;someC在头文件中定义为public

具体而言,在参数列表中:

someC[i]->a.x, someC->a.y
这告诉我其中一个是错误的。根据你的错误判断,我将选择第一个。如果我们能够看到实现OnDraw的对象的定义,以及它从何处获得someC,那么这将更加巩固

如果someC是包含对象中的C*,则第二个参数正确,第一个参数错误。 如果someC是所包含对象中的C**,那么第一个参数是正确的,第二个参数是错误的。
撇开哲学不谈,从你的评论中可以看出这一点,并强调:


我实际上在OnDraw方法中调用someC,如下所示:pDC->MoveTosomeC[I]->a.x,someC->a.y;someC在头文件中定义为public

具体而言,在参数列表中:

someC[i]->a.x, someC->a.y
这告诉我其中一个是错误的。根据你的错误判断,我将选择第一个。如果我们能够看到实现OnDraw的对象的定义,以及它从何处获得someC,那么这将更加巩固

如果someC是包含对象中的C*,则第二个参数正确,第一个参数错误。 如果someC是所包含对象中的C**,那么第一个参数是正确的,第二个参数是错误的。
我看不出有什么问题。可能还有另一个部分你错误地声明了someC?请给出导致错误的确切行,以及前面的行。另外,提供类定义,这样应该可以工作。错误来自您未在此处显示的代码。这是你正在访问的新的someC吗?首先,请告诉我们CPoint和C的定义,第二,C类中是否有成员a?如果不是,则上述语法是错误的。如果你能给我们提供更多的信息,我们就知道了。我实际上是在OnDraw方法中调用someC的:pDC->MoveTosomeC[I]->a.x,someC->a.y;someC在头文件中定义为public,我看不出有什么问题。也许还有另外一个地方
声明someC错误?请给出导致错误的确切行,以及前面的行。另外,提供类定义,这样应该可以工作。错误来自您未在此处显示的代码。这是你正在访问的新的someC吗?首先,请告诉我们CPoint和C的定义,第二,C类中是否有成员a?如果不是,则上述语法是错误的。如果你能给我们提供更多的信息,我们就知道了。我实际上是在OnDraw方法中调用someC的:pDC->MoveTosomeC[I]->a.x,someC->a.y;someC在头文件中定义为public它实际上包含一个双精度和两个cpoint,基本上是一个双精度和4个整数这是我开始分析的地方:我怀疑不使用指针速度更快,但对象变得相当大,即。,现在还不清楚哪种方法更快。它实际上包含一个双精度点和两个CPoints,基本上是一个双精度点和4个整数。这就是我要开始分析的领域:我怀疑不使用指针更快,但对象变得相当大,也就是说,不清楚哪种方法更快。谢谢!我现在真的很尴尬,我没有注意到!是的,就是这样it@neuromouse没问题。直到我再次沉迷于这些评论,发现第二个参数中缺少订阅,我才明白这一点。这是一个50/50的投篮。这是一个打字错误,但我想我会掷骰子的!我现在真的很尴尬,我没有注意到!是的,就是这样it@neuromouse没问题。直到我再次沉迷于这些评论,发现第二个参数中缺少订阅,我才明白这一点。这是一个50/50的投篮。这是一个打字错误,但我想我应该掷骰子=P
bool operator<(C const& lhs, C const& rhs) {
  return lhs.c1 < rhs.c1;
}
someC[i]->a.x, someC->a.y