gpt4 book ai didi

C++ 外部 : pointer vs. 引用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:26 25 4
gpt4 key购买 nike

我有三个类:ConsoleInputStreamConsoleOutputStreamConsoleErrorStream。它们都是从 Stream 派生的。

每个流都有虚函数readwrite;如您所料,当用户尝试使用 ConsoleInputStreamwrite 成员函数时,它会抛出一个错误。当用户尝试使用 ConsoleOutputStreamwrite 函数时,也会发生同样的情况。

现在是显示代码的时候了。

// STREAM.HPP
namespace streamlib {
extern ConsoleInputStream stdin_default;
extern ConsoleOutputStream stdout_default;
extern ConsoleErrorStream stderr_default;
extern Stream& stdin;
extern Stream& stdout;
extern Stream& stderr;
} // namespace streamlib


// STREAM.CPP
namespace streamlib {
ConsoleInputStream stdin_default;
ConsoleOutputStream stdout_default;
ConsoleErrorStream stderr_default;
Stream& stdin = stdin_default;
Stream& stdout = stdout_default;
Stream& stderr = stderr_default;
} // namespace streamlib


// MAIN.CPP
int main()
{
streamlib::stdout = streamlib::stdin;
streamlib::stdout.write(); // Still working, but should have thrown error!
}

但是,当我将 stdinstdoutstderr 定义为指针而不是引用时,一切都运行良好,即按预期抛出错误.但我不想分配/释放内存并使用 -> 运算符(我可以吗?)使用普通点运算符。

实际情况当然更复杂:我还有一些其他类型从 Stream 派生,只是希望能够快速重载 stdin stdout, stderr 流与不同类型的流。可以用引用文献来做吗?

提前致谢!

最佳答案

您不能像处理指针那样处理引用,因为不能重新分配引用。当您对引用执行此操作时

streamlib::stdout = streamlib::stdin

它对应于取消引用 指针的赋值,而不是普通指针。换句话说,如果 stdoutstdin 是指针,则等效代码将是

(*streamlib::stdout) = (*streamlib::stdin)

调用Stream的赋值操作符,将stdin赋值给stdout

解决这个问题的一种方法是定义一个可分配的“指针流”,它封装一个指向“真实”流的指针,并在分配时通过指向分配给它的任何流的指针覆盖它。这会让您保留对象语法,让您使用点 . 运算符而不是指针取消引用运算符 ->

关于C++ 外部 : pointer vs. 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20071120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com