如何解决如何从 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
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。