selfcreates类数组[2]导致问题

时间:2017-03-02 11:19:04

标签: c++ arrays class

如代码所示,我创建了一个类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;
};

2 个答案:

答案 0 :(得分:1)

看起来你的引用和指针都有一些问题。

该行

    *ConTemp = &p;

尝试取消引用指针,然后为其分配变量的地址。 *()是解除引用,&amp;()获取地址。这是没有意义的。 ConTemp不是指针,因此无法解除引用,并且您不需要p的地址。

只需编写

即可
    ConTemp = p;

编辑:正如评论中提到的domdom,你可以在任何情况下简单地使用p而不是ConTemp。

详细了解,帮助您理解它:

bool包含(Punkt&amp; p);或者我会写它bool contains(const Punkt&amp; p)const;被称为Punkt的参考。这意味着,p不是某些输入的副本,而是相同的变量。如果p被改变,它将向外改变。然而,除此之外,它的处理方式与您包含(Punkt p)的方式不同。不需要解除引用,没有指针语法,如 - &gt;。

取消引用是指针(尽管你应该避免使用指针),例如:

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访问ConTemp。这是没有意义的。 ConTemp是Punkt,Punkt没有定义那些。您需要使用ConTemp.XYCoord [0]等,或者在Punkt上定义该运算符。

或者你只是选择Punkt {public int x,y;}。或者让Punkt为int [2]另一个词。我尝试使用封装的概念来避免使用公共成员变量,并使其成为一个结构,但在开始时,可​​以尝试使用公共成员变量。建议在某个时间点,您发布一些代码以供审查。

答案 1 :(得分:1)

您特别询问的问题是因为您已声明 ConTempPunkt - 然后您尝试使用一元*间接通过它。该修复只是使用ConTemp初始化p

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。它使代码更短。