关于c++里静态变量的实例化

Leetcode上的题(所以请不要在class Solution外改),我想声明一个空指针(直接用nullptr没法用,说我auto推断类型错误)用static cube NullCube[9][9]; 在cube类里声明了。但是运行时显示NullCube没有实例化,在各处加上cube::NullCube都没法成功,不知道应该怎么修改?

#include <vector>
#include <iostream>

using std::vector;

class Solution {
    class cube{
    public:
        int value=-1;
        int avail[10] = {1,1,1,1,1,1,1,1,1,1}; //avail<=0 means not available
        int stillAvail=10;
        static cube NullCube[9][9];            /////////////////////////WHYYYYYY CAN'T I USE THIS POINTER????????
        static bool cube_put(int num,int x,int y,cube board[9][9]){
            board[x][y].value=num;
            int i,j;
            int flag = true;
            for(i=0;i<9;i++) {
                flag = flag && RmvPsb(num, i, y, board);
                flag = flag && RmvPsb(num, x, i, board);
                if (x == y) flag = flag && RmvPsb(num, i, i, board);
                if (x + y == 8) flag = flag && RmvPsb(num, i, 8 - 1, board);
            }
            return flag;
        };

        static bool RmvPsb(int num,int x,int y,cube board[9][9]){
            board[x][y].avail[num] -=1;
            if(board[x][y].avail[num]==0) board[x][y].stillAvail-=1;
            if(board[x][y].value == -1 && board[x][y].stillAvail<=0) return false;
            return true;
        }
        static bool locale0(cube board[9][9],int &x,int &y){
            for (int i = 0; i < 9; ++i) {
                for (int j = 0; j < 9; ++j) {
                    if(board[i][j].value==-1){
                        x=i;
                        y=j;
                        return true;
                    }
                }
            }
            std::cout<<"no more -1 now!";
            return false;
        }

        static auto search(cube board[9][9]){
            int x,y;
            if(!locale0(board,x,y)) return board;
            std::cout<<"searching for: \n";
            for(int i=0;i<9;i++){
                for(int j=0;j<9;j++){
                    std::cout<<board[i][j].value<<" ";
                }
                std::cout<<"\n";
            }
            for (int i = 0; i <= 9; ++i) {
                if(board[x][y].avail[i]==1){
                    cube board_[9][9];
                    for (int j = 0; j < 9; ++j) {
                        for (int k = 0; k < 9; ++k) {
                            board_[j][k]=board[j][k];
                        }
                    }//copy a new board
                    if(cube_put(i,x,y,board_)== false){
                        continue;
                    }
                    auto p=search(board_);
                    if(p!= NullCube) {std::cout<<"find it"<<p<<"\n";return p;}
                }
            }
            return NullCube;
        }
    };

public:
    void solveSudoku(vector<vector<char>>& board) {
        cube::NullCube;
        int i,j;
        cube b[9][9];
        for(i=0;i<9;i++){
            for(j=0;j<9;j++){
                if(board[i][j]!='.'){
                    cube::cube_put(int(board[i][j]-'0'),i,j,b);
                }
            }
        }
        cube::search(b);
    }
};

int main(){
    char s[9][9]= {{'5','3','.','.','7','.','.','.','.'},{'6','.','.','1','9','5','.','.','.'},{'.','9','8','.','.','.','.','6','.'},
    {'8','.','.','.','6','.','.','.','3'},{'4','.','.','8','.','3','.','.','1'},{'7','.','.','.','2','.','.','.','6'},
    {'.','6','.','.','.','.','2','8','.'},{'.','.','.','4','1','9','.','.','5'},{'.','.','.','.','8','.','.','7','9'}};

    vector<vector<char>> v(9,vector<char>(9));
    int i,j;
    for(i=0;i<9;i++){
        for(j=0;j<9;j++){
            v[i][j]=s[i][j];
        }
    }

    Solution c;
    c.solveSudoku(v);
    return 0;
}


3个回答

cube类内的静态成员变量,还需要在外边定义吧;不过类内的static静态成员变量可以在声明时立即初始化,不知道这样编译器会不会通过此段代码。

建议修改数据结构呀,初略看了看代码,感觉可以用数组替代的

sunshine6677
sunshine6677 printf是函数。cout是ostream对象,和<<配合使用。
一年多之前 回复
sunshine6677
sunshine6677 printf是函数。cout是ostream对象,和<<配合使用。
一年多之前 回复
sunshine6677
sunshine6677 静态变量属于这个类,不属于具体某个对象实例
一年多之前 回复

个人建议将NullCube修改为search()方法的局部变量,你可以试试

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问