2012-10-16 182 views
-1

我正在寫一個程序,它需要一個表,我正在模擬使用矢量數組,我已經做了一個自定義類來創建表。但是我無法看到任何類表中的項目,除了vec_data。爲什麼我不能訪問這個班的公衆成員?出於某種原因,MSVC++智能感知只能看到vec_data,沒有別的。類不能訪問公共成員C++

template<class T> 
class table 
{ 
    private: 
    T* vec_data;// initialize T 

    struct tblarray : public T 
    { 
     std::vector<T> vecTbl[]; 
     bool operator[](unsigned int i) { return vecTbl[i]; } //redefine operator[] to accept unsigned int 
     static void operator new(double n) //redefine new operator 
     { 
      void *d; 
      if(n < 0) throw std::exception("Invalid Allocation to Negative number!"); 
      if(assert((d=malloc(n)) != 0) = 0) throw std::bad_alloc; 
      return d; 
     } 
     void operator delete(void *d) //redefine delete operator 
     { 
     if(assert((free(p))) = 0) throw std::exception("Invalid Free of specified data!"); 
     } 
     tblarray(const T&, unsigned int size) : T //one constructor 
     { 
     vecTbl = this.new std::vector<T>[reinterpret_cast<double>(size)]; 
     } 
     ~tblarray() //one destructor 
     { 
     this.delete(vecTbl); 
     } 
} 
public: 
    table(const T&, unsigned int size) : T 
    { 
     this.tblarray.tblarray(T, size); 
    } 
    ~table() 
    { 
     this.tblarray.~tblarray(); 
    } 
} 

例如:

table<int> tblOne; //legal 
table.table(int, 123); //not legal(probably not legal anyways, but intellisense says the function does not exist?) 
+0

'table(const T&,unsigned int size)'是一個構造函數,構造函數沒有命名,也不能直接調用。 (破壞者正式也未命名,但可以直接調用,你應該不應該有99.9%的時間。) –

+0

但是這樣做:表 * tblOne = new表(123)throws:沒有合適的構造函數將int轉換爲表儘管,我有一個在構造函數 – 7c00h

+1

中類型爲int的輔助參數,我寧願你不知道你在做什麼。'table(const T&)'是一個拷貝構造函數,'table(unsigned int)'是一個轉換構造函數。你有什麼是一個正常的,兩個參數的構造函數。要使用它,你需要傳遞_two_參數。一個'table'和一個'unsigned int'。 –

回答

0

table.table(1,123)是非法的。你不能像這樣調用構造函數。

+0

我明白,但是,這個問題不是關於我的構造函數調用的合法性,而是關於爲什麼我可以訪問它。 – 7c00h

+0

你的意思是你爲什麼不能? 我想Intellisense的數字是否是非法的,你沒有理由把它稱爲實例成員。您可以像創建對象時可能知道的那樣調用構造函數。 –

+0

「'table.table(1,123)'在類作用域外是無效的,你可以用'::'而不是'''調用構造函數,但是你需要爲類模板提供模板參數。編輯:實際上,它只是允許它的Visual C++。哎呀。但無論如何,在標準中不禁止構造函數調用。假設構造函數接受兩個int類型的參數,正確的方法是'表(1,123)'。 –

0

你的struct聲明之後錯過了分號:

template<class T> 
class table 
{ 
private: 
    T* vec_data;// initialize T 

    struct tblarray 
    { 
     std::vector<T> vecTbl[]; 
     bool operator[](unsigned int i) { return vecTbl[i]; } //redefine operator[] to accept unsigned int 
     static void operator new(double n) //redefine new operator 
     { 
      void *d; 
      if(n < 0) throw std::exception("Invalid Allocation to Negative number!"); 
      if(assert((d=malloc(n)) != 0) = 0) throw std::bad_alloc; 
      return d; 
     } 
     void operator delete(void *d) //redefine delete operator 
     { 
      if(assert((free(p))) = 0) throw std::exception("Invalid Free of specified data!"); 
     } 
     tblarray(const T&, unsigned int size) : T //one constructor 
     { 
      vecTbl = this.new std::vector<T>[reinterpret_cast<double>(size)]; 
     } 
     ~tblarray() //one destructor 
     { 
      this.delete(vecTbl); 
     } 
    }; 
public: 
    table(const T&, unsigned int size) : T 
    { 
     this.tblarray.tblarray(T, size); 
    } 
    ~table() 
    { 
     this.tblarray.~tblarray(); 
    } 
} 

另外這裏的實例:

int j = 1; 
table<int> t(j, 2); 

BTW,常量牛逼&在構造函數是多餘的,類型中已經取代在模板參數

+0

'this.delete(vecTbl);'不會編譯。還有其他的東西將無法編譯。在發佈之前請*測試*代碼。不要追趕SO代表。慢慢來。 :-) –

+0

嗯,還有很多其他的編譯錯誤。我剛剛解決了OP要求的內容。 – zabulus

3

如果這是你的真實代碼,那麼你有一些小錯誤:

  • 在C++中每個類(包括結構和聯合)使用;必須終止,但你不;

  • 終止tblarray據我看到的,在你的模板實例,Tint,但tblarray派生自T,想想你能有struct test : int

  • 您的所有屬性(您沒有任何功能:變量:vec_data和類型:tblarray)是私人的,因此您想如何訪問它們?

  • 在C++ this是一個指針不是一個參考,所以你必須用this->

  • 更換this.爲了訪問您的專業操作者使用的保留字operator所以轉換this.delete(vecTbl)operator delete(vecTbl)(也這是不是一個好的做法,operator delete聲明刪除你不類其成員的一個實例!)

  • table是你的類的構造函數,因此,當你想實例化雜物應該使用它ble:table<...> t(1, 100)並且由於您聲明瞭非默認構造函數,並且您沒有默認構造函數,所以您不能擁有table<...> t,因爲它需要默認構造函數。