自我创建级阵列[2]正在引起问题

selfcreates class an array[2] is causing problems

本文关键字:问题 创建 阵列 自我      更新时间:2023-10-16

,如代码I创建了一个Punkt(在德语中为点)。它是保存X和Y轴数据的array[2]类型。代码尚未完成和正确,我只想逐步开始。线:

bool contains (Punkt &p){
    Punkt ConTemp;
    *ConTemp = &p;

正在引起问题。用CodeBlocks编译它给我错误:

operator []不匹配[](操作数类型ARR punkt和int)。

问题在哪里?

enter code here
#include <iostream>
#include <array>
using namespace std;
class Punkt {
    public: int XYCoord [2]={};
    void setupCoord (int x, int y){
        XYCoord[0]=x;
        XYCoord[1]=y;
    }
};
class Rechteck {
    Punkt ReCoordLu,ReCoordRo;
    double flaeche(double x, double y){
        double xy=x*y;
        return xy;
        }
    bool contains (Punkt &p){
        Punkt ConTemp;
        *ConTemp = &p;
        if (ConTemp[0]>=&&ReCoordLu[0]&&ConTemp[1]>=&&ReCoordLu[1]&&
            ConTemp[0]<=&&ReCoordRo[0]&&ConTemp[1]<=ReCoordRo[1]){
            return true;}
        else{
            return false;}
            };
    bool contains (Rechteck &){
        if (1){
            return true;}
        else
            return false;
        }
    };
int main()
{
   /* Rechteck sharedRectangle (Rechteck a , Rechteck b){
        Rechteck c;
        return Rechteck c;
        } */
    Punkt P1,P2;
    P1.setupCoord(1,1);
    P2.setupCoord(5,5);
    cout<<"hello"<<P2.XYCoord[0];
    return 0;
};

您特别询问的问题是因为您已声明 ConTemp作为Punkt-然后尝试使用Unary *间接通过它。修复程序只是用p初始化ConTemp

bool contains (const Punkt &p){   // Better to take by const ref where possible.
    Punkt ConTemp = p;            // Initilize

您的测试也很可怕。您有:

    if (ConTemp[0]>=&&ReCoordLu[0]&&ConTemp[1]>=&&ReCoordLu[1]&&
        ConTemp[0]<=&&ReCoordRo[0]&&ConTemp[1]<=ReCoordRo[1]){

应该是:

    if (ConTemp.XYCood[0]>=ReCoordLu.XYCood[0]&&ConTemp.XYCood[1]>=ReCoordLu.XYCood[1]&&
        ConTemp.XYCood[0]<=ReCoordRo.XYCood[0]&&ConTemp.XYCood[1]<=ReCoordRo.XYCood[1]){

就个人而言,我会重写为:

    if (ReCoordLu.XYCood[0] <= ConTemp.XYCood[0] && 
                               ConTemp.XYCood[0] <= ReCoordRo.XYCood[0] &&
        ReCoordLu.XYCood[1] <= ConTemp.XYCood[1] && 
                               ConTemp.XYCood[1] <= ReCoordRo.XYCood[1]){

处理多个比较时,如果它们都在相同的方向上,我发现阅读更容易。

我还将将XYCoord重命名为xy。它使代码短得多。

看来您一起参考和指针都有一些问题。

线

    *ConTemp = &p;

试图取消指针,然后分配变量的地址。*()正在删除,&amp;()正在获取地址。这是没有意义的。当代不是指针,因此不能被删除,您不需要第p。

的地址。

简单地编写

它将有效
    ConTemp = p;

编辑:正如域中所建议的那样,您可以在任何情况下都可以使用P而不是当代。

更详细地了解它:

bool包含(punkt&amp; p);或正如我所写的,bool包含(const punkt&amp; p)const;被称为Punkt的参考。这意味着,P不是某些输入的副本,而是相同的变量。如果P更改,它将向外部更改。但是,除此之外,它的对待与包含的对待并不不同(punkt p)。无需取消给出,没有指针语法,例如 ->。

删除适用于指针(尽管您应该避免使用指针),例如:

int a = 5;
int* p_a = &a; //now p_a stores the address of a
*p_a = 6; //dereference p_a and assign a new value to it
cout << a << endl; //prints 6

&amp;这与您用于参考的内容不同,我想这使您感到困惑。您可能想重新阅读一些有关参考和指针的基本教程,但不要以此为消息,即您在编程方面会很不好,只是一个初学者(至少在C 中)。

编辑:正如Domdom指出的那样,您还犯了一个错误,以尝试使用[] -brackets访问当代。这是没有意义的。当代是朋克,朋克没有定义这些。您需要使用当代[0] et cetera或在punkt上定义操作员。

,或者您只需与class punkt {public int x,y;}一起使用。或使punkt又为int [2]。我会尽量避免使用封装概念,并使其成为一种结构,但是在开始时,人们可以尝试使用公共成员变量。建议您在某个时间点发布一些代码以进行评论。