2012-02-21 34 views
3

有對象數組和對象添加到它,我試圖執行以下操作:添加對象,以C++對象的陣列

Shape ShapeList[30]; 

void addShape(Shape s) 
{ 
    for(int i=0; i<30;i++) 
    { 
    if(ShapeList[i] != '\0') 
     { i++;} 
    else 
     { 
      ShapeList[i]=s; 
      numShapes++; 
      break; 
     } 
    } 
} 

numShapes是整型變量,形狀爲類和ShapeList是對象數組。但編譯器以這種方式給出了一個錯誤,!=運算符是不允許的。那麼我如何實現這個?

+0

ShapeList是形類?如果是這樣,你應該調用ShapeList的實例,而不是類名稱。 – Davos555 2012-02-21 09:37:44

+1

ShapeList是對象數組 – 2012-02-21 09:40:12

+0

@user我嚴重懷疑您接受的答案實際上是否會幫助您。 – 2012-02-21 11:45:33

回答

4

我認爲你需要改變你的 '容器' 的聲明:

Shape *ShapeList[30]; 

void addShape(Shape *s) 
{ 
    for(int i=0; i<30;i++) 
    { 
    if(ShapeList[i]) 
     { i++;} 
    else 
     { 
      ShapeList[i]=s; 
      numShapes++; 
      break; 
     } 
    } 
} 

,並呼籲addShape這樣:

addShape(new Shape()); 
+1

請注意,雖然這個答案修復了代碼中的明顯問題,但它仍然不是很好的代碼。特別是,它容易發生內存泄漏。 C++爲此提供了卓越的機制。 – 2012-02-21 11:53:42

+0

@ konradrudolph你可以建議任何其他機制 – 2012-02-21 12:09:31

+0

@user它真的取決於具體的情況,但如果你不需要多態性,那麼根本不要使用指針;直接存儲對象。否則,一個簡單的通用解決方案是使用'std :: shared_ptr'而不是原始指針,以及'std :: array'或'std :: vector'而不是數組。 – 2012-02-21 12:18:05

2

ShapeList[i]返回Shape類型的對象。在這種情況下,您可以重載operator != (char)

class Shape 
{ 
//your implementation 
// 
public: 
    bool operator != (char x) const 
    { 
    // comparison logic 
    } 
}; 

而且,我相信你在這裏有一個錯誤:

if(ShapeList[i] != '\0') 
    { i++;} 

我假設你想跳過這種情況下,但你已經在for循環增量i。你可能想:

if(ShapeList[i] != '\0') 
    { continue;} 

正如其他人所指出的那樣,你應該使用std::vector來代替原始的數組。我最初認爲ShapeList是對容器的包裝。

+1

你還沒有添加對象到數組 – 2012-02-21 10:30:10

+1

這個答案是嚴重困惑。你可能會得到這樣的代碼,但它肯定是**而不是OP想要的。 – 2012-02-21 11:39:52

+0

@KonradRudolph我假設他想比較'形狀'和'字符'。 – 2012-02-21 11:44:51

1
Shape * ShapeList[30]; 
    numShapes=0; 

    void addShape(Shape* s) 
     { 
      if(i>=30) 
       return; 
      ShapeList[numShapes++]=s;  // provided you need to insert at end 
     } 

您不能使用\0,因爲它是一個數組而不是字符串。

存儲整個對象就像是一個帶有內存的開銷。指針是一個更好的選擇,除非你有局部變量超出範圍問題。並且如果STL和向量不超出您的項目範圍,則您嘗試使用它。在其中您可以使用pushback()或pushfront()

+2

這是如何回答這個問題的? – 2012-02-21 09:40:51

+0

你有沒有發現這個問題? – 2012-02-21 09:44:52

+1

它不回答問題。 – 2012-02-21 09:45:56

0

除非在Shape類中有一個轉換運算符將其轉換爲字符,或者將字符作爲參數的非等號比較運算符,否則不能像你一樣將Shape對象與char進行比較。

您應該使用std::vectorstd::array並使用at成員函數來查看條目是否存在。

0

您沒有指定如何聲明ShapeList

使用!=運算符將其與字符NUL 進行比較,同時在下面的4行將其分配給Shape對象。

我認爲你正在努力實現的目標是:在指向Shape的指針數組中找到一個空插槽,並在那裏存儲Shape。

但可能更好的是使用std :: vector或std :: list和push_back你的形狀。

另一件事你必須問自己:我想存儲我的Shape對象或指針的副本嗎?