2017-03-02 76 views
0

如代码中所示,我创建了一个类Punkt(意思是德语)。这是一个array[2]类型来保存x和y轴数据。代码还没有完成和正确,我只是想让它一步一步开始。 行:selfcreates class array [2]正在导致问题

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

是造成问题。用codeblocks编译给我错误:

no match for operator [] (operand types arr punkt and 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; 
}; 
+0

当然,无论你喜欢什么,你都可以自由地命名你的类,方法和变量,但我强烈推荐@ Aziuth的建议是仅仅使用英语。 – domsson

回答

1

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

线

*ConTemp = &p; 

试图取消引用指针,然后到一个变量的地址分配给它。 *()取消引用,&()正在获取地址。这是没有意义的。 ConTemp不是一个指针,因此不能被解除引用,并且你不需要p的地址。

它的工作简单地写

ConTemp = p; 

编辑:作为domdom在评论所说,你可以简单地使用P的当代,而不是在任何情况下。

要进入更详细,以帮助您理解它:

BOOL包含(PUNKT & P);,或者我会写它布尔包含(常量PUNKT & 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 

的&这里的东西比你使用供大家参考,我想这让你感到困惑的一个不同。你可能想重读关于引用和指针的一些基本教程,但不要把它当作一个消息,说你在编程时会很糟糕,只是一个初学者(至少在C++中)。

编辑:正如domdom指出的,你也犯了错误,试图用[]括号来访问ConTemp。这是没有意义的。 ConTemp是一个Punkt,Punkt没有定义这些。您需要使用ConTemp.XYCoord [0]等等,或者在Punkt上定义该运算符。或者你只需​​与Punkt {public int x,y;}一起去。或者让Punkt换成int [2]。我试图避免公共成员变量,使用封装的概念,并使其成为一个结构,但在开始时,可​​以试用公共成员变量。建议您在某个时间点发布一些代码进行审查。

+0

另外,他不能只是在'p'上工作,而不是先制作副本?另外,如果我没有弄错,'ConTemp [0]'会引起进一步的问题,不是吗?看到他正试图访问一个对象,就好像它是一个数组,当他真的想访问该对象的成员时。 – domsson

+0

@dom我认为Punkt已经定义了[] -operator。对于一个点来说,像数组一样存储以访问不同的坐标是有意义的。 – Aziuth

+1

@domdom:成员的好位置 - 错过了我的回答。 –

1

你专门请教了有关的问题,因为你已经宣布 ConTemp作为Punkt - 然后你尝试通过间接它一元*。该修补程序只是用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。它使代码更短。