2011-06-28 78 views
3

我的代碼有什麼問題?它不會編譯..char數組編譯錯誤

class FileNames 
    { 
     public: 
      static char* dir; 
      static char name[100]; 

      static void Init3D() 
      { 
      FileNames::dir = "C://3D//"; 
      FileNames::name = "abc"; 
      } 
    }; 
+1

你得到什麼錯誤? – 2011-06-28 12:55:53

+2

下一次,請發佈您收到的編譯錯誤。 –

+0

你能發佈錯誤嗎? – MGZero

回答

5

不能分配到一個數組,所以FileNames::name = "abc"失敗(char arr[4] = "abc"的作品,但是,因爲這是一個直接初始化,不分配)。在這裏也可以使用char*,或使用strcpy將數據複製到陣列,或更好地使用std::string,這樣可以避免原始字符串的許多缺點。

最重要的是,你需要在全局範圍的某個地方定義你的靜態成員,在函數之外: char FileNames::name[100];。此時,即使使用數組,也可以使用=的初始化語法,但要分配的字符串需要與數組具有相同的長度。

+0

您必須將FileNames :: name failed - 不是FileNames :: dir。 FileNames :: dir不是數組 – Nick

+0

謝謝,解決並澄清。 –

1

有兩個問題與您的代碼:

1)你複製的變量name(兩種不同類型)。
2)你不能初始化那樣的靜態成員(見下面的例子)。

最後一件事情不是這樣的問題,但你應該考慮使用std::string來代替,因爲它封裝了字符串的功能,所以你不需要處理原始指針。這是一個很少痛苦,尤其是如果你是新手這類事情。

它改成這樣:

// Header file 
class FileNames 
{ 
private: 
    static char* name; 
public: 
    static char* dir; 
}; 

CPP file 
#include "FileNames.h" 

char* FileNames::name = "abc"; 
char* FileNames::dir = "C://3D//"; 

// Now use your class... 
+0

1)嗯......不,他沒有? 2)他沒有初始化,他在運行時爲它們賦值,應該沒問題。正如另一個答案中指出的那樣,問題是您不能使用賦值運算符在C/C++中複製數組。 – Lundin

+0

@Lundin,1)在他的問題的原始版本中(它是靜態char *名稱),這導致了2)的原因。 –

+0

阿哈,一個隱身編輯:) – Lundin

0

嘗試初始化是這樣的:

class FileNames 
{ 
    public: 
     static char* dir; 
     static char name[]; 

}; 

char *FileNames::dir = "C://3D//"; 
char FileNames::name[100] = "abc"; 
0

你記得實際定義類以外的靜態成員?另外,我不相信你需要解決範圍,除非你真的不在課堂之外。

-1

用途:

FileNames::dir = new char[strlen("C://3D//")]; 
strcpy(FileNames::dir, "C://3D//"); 
strcpy(FileNames::name, "abc"); 

另外,不要忘了#include <cstring>和後來delete[](FileNames::dir)

+0

strcpy到dir指向的隨機地址是一個非常糟糕的想法。 – Lundin

+0

@Lundin - 同意! Blech ......誰會這麼做! :p – Andrew