[英]Unhandled exception trying to set constructor to 0 - c++
嘗試將構造函數數組設置為零時,我收到未處理的異常。 我認為問題出在構造函數上,但我不確定。 我刪去了不必要的代碼並重現了錯誤。 感謝您的反饋。
錯誤消息:0x0fa4025未處理的異常:訪問沖突寫入位置0x0000。
資源:
#include <iostream>
#include <vector>
#include "header.h"
using namespace std;
foo::foo(int b[3][3])
{
memset(b, 0, sizeof b);
}
void foo::makeMove()
{
board[1][1] = 1;
}
void foo::print()
{
for (int i = 0; i < 2; i++){
for (int j = 0; j < 2; j++){
cout << board[i][j];
}
}
}
標頭:
class foo
{
public:
foo::foo(int[3][3] = 0);
void makeMove();
void print();
private:
int board[3][3];
};
主要:
#include "header.h" // include definition of class TicTacToe
int main()
{
foo g; // creates object g of class TicTacToe
g.makeMove(); // invokes function makeMove
g.print();
} //
結束主
foo::foo(int[3][3] = 0);
參數的默認值是指針,而不是數組,已設置為0
。 當沒有參數傳遞給構造函數時,此參數無效。 因此,這不是合理的默認設置。
然后,您可以通過memset
對其進行寫入,后者會調用未定義的行為。 我什至看不到這種設計的意義。 為什么要使用一個外部數組並將其設置為全0? 您的班級有其自己的陣列board
。 用那個
接下來,認識到這是C ++,並且您就像在編寫C一樣編寫代碼。您有矢量, std::copy
等。
發生這種情況是因為指定了指針的默認值(當然,它指向數組): foo::foo(int[3][3] = 0);
。 因此,您正在嘗試memset
0x0。
您的構造函數在不檢查b
是否為0的情況下寫入b
您默認b
為0,因此調用未定義的行為。
在之前添加空校驗memset
在CTOR。
您創建了foo類的對象
foo g;
使用默認構造函數,默認參數等於0。
foo::foo(int[3][3] = 0);
當您嘗試使用內存0訪問內存以填充內存時
foo::foo(int b[3][3])
{
memset(b, 0, sizeof b);
}
我也認為這個構造函數
foo::foo(int b[3][3])
{
memset(b, 0, sizeof b);
}
沒有任何意義,因為它處理局部變量b。 我認為您想填充數據成員int board [3] [3]; 不是局部變量。
我認為您的主要錯誤是定義一個成為“默認”構造函數的構造函數。 這是因為您給它提供了默認值,因此可以不帶任何參數地調用它。 您的循環也是錯誤的。 見下文。
#include <iostream>
#include <vector>
#include <memory.h>
using namespace std;
class foo
{
public:
void makeMove();
void print();
private:
int board[3][3] { { 0 }, { 0 }, { 0 } };
};
void foo::makeMove()
{
board[1][1] = 1;
}
void foo::print()
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
cout << board[i][j];
}
cout << endl;
}
}
int main()
{
foo g; // creates object g of class TicTacToe
g.makeMove(); // invokes function makeMove
g.print();
} //
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.