-3

所以我得到了這個Exception,我知道這只是因爲我是新來的C++和我的代碼是錯誤的(所以,不,這不是一個已經問過的問題)。在cout上的System.AccessViolationException << line

我得到了Frog.cpp文件和program.cpp文件。

Frog.cpp:

#include <iostream> 
#include <conio.h> 
#include "Frog.h" 

using namespace std; 

Frog::Frog() 
{ 
    (*this).status = Free; 
    (*this).color = "Green"; 
    (*this).weight = 200; // In grams 
} 
Frog::Frog(float weight, int age, char* color, char* nickname, Status status) 
{ 
    (*this).weight = weight; 
    (*this).age = age; 
    (*this).color = color; 
    (*this).nickname = nickname; 
    (*this).status = status; 
} 
Frog::Frog(float weight, int age) 
{ 
    (*this).weight = weight; 
    (*this).age = age; 
} 
void Frog::currentState() 
{ 
    cout << "Weight:" << (*this).weight << " ,Age:" << (*this).age << " ,Color:" << (*this).color << " , Nickname:" << (*this).nickname << " , Status:" << (*this).status << endl; // The ling that causeing the mayhem 
} 

Frog.h:

#ifndef FROG_H 
#define FROG_H 
typedef enum Status { Free, Urban, Plate, Dead }; 

class Frog 
{ 
    private: 
     float weight; 
     int age; 
     char* color; 
     char* nickname; 
     Status status; 
    public: 
     Frog(); 
     Frog(float weight, int age, char* color, char* nickname, Status status); 
     Frog(float weight, int age); 
     void currentState(); 
}; 

#endif 

Program.cpp:

#include <iostream> 
#include <conio.h> 
#include "Frog.h" 

using namespace std; 

void main() 
{ 
    Frog frog = Frog(); 

    frog.currentState(); // I get the Exception on this line 


    getch(); 
} 

除外:

Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 
     at std.char_traits<char>.length(SByte* _First) in c:\program files (x86)\microsoft visual studio 12.0\vc\include\iosfwd:line 523 
     at std.operator<<<struct std::char_traits<char> >(basic_ostream<char\,std::char_traits<char> >* _Ostr, SByte* _Val) in c:\program files (x86)\microsoft visual studio 12.0\vc\include\ostream:line 791 
     at Frog.currentState(Frog*) 

壞線cout << "Weight:" << (*this).weight << " ,Age:" << (*this).age << " ,Color:" << (*this).color << " , Nickname:" << (*this).nickname << " , Status:" << (*this).status << endl;Frog.cpp

任何建議將不勝感激。

+0

OT:對於任何指針「foo」,您都可以寫'foo-> bla'而不是'(* foo).bla'。 (也有幾個非指針)。 –

+0

你不檢查的綽號是有效的,並沒有將其設置爲默認的構造函數的默認值。試圖打印一個不指向有效c字符串的const char *是一個不同的錯誤計劃。 – jaggedSpire

+0

邊注:請使用類初始化列表(和替換(*此)這個 - >) –

回答

4

Frog frog = Frog();創建默認構造的Frog。您的默認構造函數是

Frog::Frog() 
{ 
    (*this).status = Free; 
    (*this).color = "Green"; 
    (*this).weight = 200; // In grams 
} 

其中不初始化nickname。當你打印它在currentState()你正在訪問垃圾指針。這是未定義的行爲並導致訪問衝突。

我建議你使用std::string,所以你不必擔心這一點。我也建議你使用member initialization list。因爲你的課程看起來像

class Frog 
{ 
    private: 
     float weight; 
     int age; 
     std::string color; 
     std::string nickname; 
     Status status; 
    public: 
     Frog() : status(Free), color("Green"), weight(200), age(0), nickname("") {} 
     Frog(float weight, int age, std::string color, std::string nickname, Status status) : 
      status(status), color(color), weight(weight), age(age), nickname(nickname) {} 
     Frog(float weight, int age); 
     void currentState(); 
}; 
+0

什麼是成員初始化列表? – God

+0

@God的[C++超級FAQ對主題的幾個條目(https://isocpp.org/wiki/faq/ctors#init-lists) – jaggedSpire

+1

@God我添加了一個鏈接到了答案。 – NathanOliver

-1

好吧我只是愚蠢的。

爲@jaggedSpire建議:

我沒有初始化nicknameage性能。

雖然我雖然在C++的屬性獲得默認值,如果我使用默認的構造函數。

謝謝你們。

+0

他們確實是會獲得一個默認值,如果沒有明確的初始化。你只是使用C字符串,所以默認值是傳遞給'std :: ostream&operator <<(std :: ostream&,const char *)'的無效參數。 NathanOliver是給予很好的建議:用'的std :: string'和初始化列表 – jaggedSpire

+0

不是downvoter,但對此事的看法:什麼將是一個指針和默認值有什麼用這將是你,因爲它可能不會指向任何可以安全打印的地方? – user4581301

+0

@ user4581301你絕對正確。 – God

相關問題