劇透警告:我忘記了頭檔案中的 *,它編譯但忽略了我的運算子多載,只是列印了地址。
導致這個混亂的問題,我很抱歉!謝謝你們!
我已經包含了一個我想要做的簡單示例。我有一個指向類的指標,我需要使用 << 輸出它, 而不先復制值。
我實作了一個將參考作為引數的 operator<< 函式。在 StackOverflow 上的幾個答案中也提出了這一點 -
但是,我無法讓編譯器實際選擇我的多載運算子函式。
當我運行下面的示例時,它只是回傳0x6af59ffac0
(因為使用了標準的 << 指標實作)
當然,您始終可以取消參考指標并撰寫按值傳遞運算子<< 函式。但在我的情況下,這是不允許的,因為不應在堆疊上創建該類的其他實體。(基本上試圖在不復制課程的情況下實作這一目標)
因此,在這一點上,我可能會在特定情況下簡單地避免 << 運算子,并撰寫我自己的函式。(見底部的解決方法)但我不禁對此感到沮喪。當然,應該有一種方法可以提示編譯器使用哪個版本的運算子?(類似于 rust 的 Turbofish Operator ::<>)
或者這在法律上是不可能的?
例子::
#include <iostream>
using namespace std;
class TEST {
public:
string name;
int id;
TEST(string nname, int iid) : name(nname), id(iid) {}
};
std::ostream& operator<<(std::ostream& out, TEST &m) {
return out << "Test Output, class has values: ID" << m.id << "; NAME: " << m.name;
}
int main() {
TEST var("tester", 22);
cout << &var; // Just prints the memory location
cout << (TEST*) &var; // Still just prints the memory location
return 0;
}
我會做些什么來避免語言限制(如果沒有人有答案):(這對我有用,因為方法在其堆疊框架中沒有其類的副本,只有一個指標)
#include <iostream>
using namespace std;
class TEST {
public:
string name;
int id;
TEST(string nname, int iid) : name(nname), id(iid) {}
std::ostream& display(std::ostream& out) {
return out << "Test Output, class has values: ID" << this->id << "; NAME: " << this->name;
}
};
std::ostream& operator<<(std::ostream& out, TEST m) {
return m.display(out);
}
int main() {
TEST var("tester", 22);
var.display(cout);
return 0;
}
uj5u.com熱心網友回復:
我有一個指向類的指標,我需要使用 << 輸出它,而不先復制值。
你寫了
std::ostream& operator<<(std::ostream& out, TEST &m)
它參考一個TEST物件并且不復制任何東西。為什么你認為它會復制一些東西?
無論如何,那個流插入操作可能應該是
std::ostream& operator<<(std::ostream& out, TEST const &m)
(因為它不應該改變它列印的物件)。
但是,我無法讓編譯器實際選擇我的多載運算子函式。
好吧,您撰寫了一個帶有參考引數的多載。你必須傳遞一個參考,因為那是你寫的型別。要獲得一個帶指標的...只需撰寫一個帶指標引數的
std::ostream& operator<<(std::ostream& out, TEST const *m)
{
return out << "TEST* : ID" << m->id << "; NAME: " << m->name;
}
請注意,默認ostream& operator<<(ostream&, void*)值總是比任何特定的非空指標多載更差。它只是依靠它,因為它是唯一可用的匹配項。
只是為了再次澄清
當然,您始終可以取消參考指標并撰寫傳值運算子<< 函式
沒有人建議 pass-by-value operator<<,這不是你最初寫的。您確實在第二個代碼塊中添加了按值傳遞的版本,但是由于第一個版本是按參考傳遞的,我不知道為什么。如果您不知道如何閱讀基本語法,例如&,*和->,那么這將是閱讀一本好書的絕佳時機。
uj5u.com熱心網友回復:
請記住,在宣告變數(包括引數)時,&指的是參考,而不是指標。
這意味著您需要傳遞(使用)要參考的實際物件實體:
std::cout << var << '\n';
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/513858.html
標籤:C 指针
