如何从 C++ 中的引用类型创建指针变量?

问题描述

我想创建一个全局指针,以便所有函数都可以访问该引用。

我已经尝试将引用地址分配给一个指针,但是当我尝试访问这些值时却出现编译错误

vector<vector<char>>* table;

class Solution {
public:
    void solveSudoku(vector<vector<char>>& board) {
        table = &board;
        cout << board[0][0] << "\n" << table[0][0];
    }
};
Line 70: Char 37: error: invalid operands to binary expression ('basic_ostream<char,std::char_traits<char>>' and '__gnu_cxx::__alloc_traits<std::allocator<std::vector<char,std::allocator<char>>>,std::vector<char,std::allocator<char>>>::value_type' (aka 'std::vector<char,std::allocator<char>>'))
        cout << board[0][0] << "\n" << table[0][0];
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/cstddef:130:5: note: candidate function template not viable: no kNown conversion from 'basic_ostream<char,std::char_traits<char>>' to 'std::byte' for 1st argument
    operator<<(byte __b,_IntegerType __shift) noexcept
    ^

解决方法

应该是 (*table)[0][0]

table[0] 等价于 (*table)(向量 board 的向量)。

所以 table[0][x] 就是 board[x]

vector 不可流式传输。

,

由于其他人描述的原因,您的代码无法编译,您实际上没有取消引用指针 (*table)[0][0],结果表达式返回错误类型

C++ reference 是“绑定”到它的原始对象的别名,实际上不可能获得引用本身的地址或值,您将获得绑定对象的地址和值。在某些情况下,引用根本没有内存表示,在其他情况下,它实际上是一个地址,但标准没有定义。 如果函数的参数通过引用传递,则参数表达式表示的对象绑定到函数参数的名称,在您的情况下它是 board,直到函数调用结束。在那之后,如果对象是临时的并且我们可以以某种方式存储引用,引用就会悬空:

void foo (Type& a)
{
    static Type& ref  = a; // BAD idea. this initialization happens only once
    // but on second call `ref` may refer to non-existing instance of Type
}

如果你出于某种奇怪的原因需要一个行为类似于引用的容器,有 std::reference_wrapper,但它是一个很少直接使用的类,而是在实现容器时使用。

附注。您还有另一个问题,默认情况下 char 被流视为字母。您可能希望将数独的元素存储为枚举或其他整数类型,或者记住您必须进行强制转换。

PPS。我不会在这里使用 std::vector<std::vector<T>> 类型。我宁愿采用 OOP 风格并创建封装板功能的类,例如(这是一些细节的草图,例如故障保护)

class Sudoku {
public:
    enum Number { none = 0,one = 1,two,three,four,five,six,seven,eight,nine};
    
    Sudoku(int N) : rank(N),data(N*N,Sudoku::none) { }
    // add more constructors here if needed?
    
    // would allow to address particular element,e.g. board(i,j) 
    Number operator() (unsigned col,unsigned row) const
    { return data[row*rank + col];  }
    
    Number& operator() (unsigned col,unsigned row)
    { return data[row*rank + col];  }
    
    unsigned size() const {return rank;}
    
    // more operations,resize,a copy operation on board if required?
private:
    unsigned             rank; // size of board
    std::vector<Number>  data; // content of board
};