程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Cstring使用問題和struct結構體初始化方法匯總

Cstring使用問題和struct結構體初始化方法匯總

編輯:C++入門知識

今天在寫程序為cstringarray變量操作時遇見:
ASSERT_VALID fails with illegal vtable pointer.
Assertion Failed: <unknown application>: File array_s.cpp, Line 236
這兩個問題,幾經查找、詢問才知道是定義的結構體中的cstringarray虛擬表出錯。
仔細看程序時才發現,我申請的結構體的指針,用memest初始化了,原來結構體沒加cstringarray變量,全是char類型,所以用memset初始化。www.2cto.com
cstringarray變量是不能用memset初始化的!!(至於為何還不很清楚......)
不用memset初始化,那我的結構體怎麼初始化呢?
google一下發現有一下3種方法可以完成初始化:
1、結構體的構造函數中初始化
在C++中,結構體與類在使用上已沒有本質上的區別了,所以可以使用構造函數來初始化。
如下代碼所示:
  struct Stu
 {
  int  nNum;
  bool bSex;
  char szName[20];
  char szEmail[100];
  //構造函數初始化
  Stu()
  {
   nNum = 0;
   bSex = false;
   memset(szName,0,sizeof(szName));
   memset(szEmail,0,sizeof(szEmail));
  }
 };
你可能已經發現了,如果結構體中有大量成員,一個個賦值,相當麻煩。那麼你可以這樣寫:
 struct Stu
 {
  int  nNum;
  bool bSex;
  char szName[20];
  char szEmail[100];
  //構造函數初始化
  Stu()
  {
    memset(this,0,sizeof(Stu));
    //或者是下面的格式
    //memset(&nNum,0,sizeof(Stu));
  }
 };
如果在結構體中分配了指針,並且指針指向一個堆內存,那麼就在析構函數中釋放。以上便是在構造函數中初始化。
2、繼承模板類初始化
首先定義一個模板基類:
template <typename T>
class ZeroStruct
{
public:
    ZeroStruct()
    {
        memset(this,0,sizeof(T));
    }
};
之後定義的結構體都繼承於此模板類。
    struct Stu:ZeroStruct<Stu>
    {
        int        nNum;
        bool    bSex;
        char    szName[20];
        char    szEmail[100];
    };
這樣也能實現初始化。
3、定義時初始化
    struct Stu
    {
        int     nNum;
        bool    bSex;
        char    szName[20];
        char    szEmail[100];
    };
//定義時初始化
Stu stu1 = {0};
在有的結構體中,第一個成員表示結構體的大小,那麼就可以這樣初始化:
struct Stu
 {
  int nSize; //結構體大小
  int  nNum;
  bool bSex;
  char szName[20];
  char szEmail[100];
 };
Stu stu1 = {sizeof(Stu),0};
後面的0,可以省略掉,直接寫成:Stu stu1 = {sizeof(Stu)};後面自動會用0填充。
總結分析:
前面兩種,實際上已經把結構體給類化了,和類的使用差不多。第三種,是純粹的結構體的寫法。
如果用途僅僅限定為結構體,我建議不要加上構造函數,也不要繼承於那個模板類,因為這個時候結構體實際上已經是類了。在定義結構體時,將無法使用第三種方式去初始化,當然,此時也不需要初始化了。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved