這是簡化代碼只是爲了顯示我的問題:
的main.cpp無效使用不完全類型的錯誤
#include "one.hpp"
#include <iostream>
int main(){
One one;
std::cout << one.two->val;
}
one.hpp:
struct Two; <- forward declare Two
struct One{
One();
~One() { delete two;}
Two* two;
};
one.cpp
#include "one.hpp"
struct Two{
int val;
};
One::One(): two(new Two()) {}
編譯時,我得到錯誤使用不完整的類型'struct Two'。 我認爲,因爲兩個是不完整的類型,我只是不能參考其領域... 我想知道是否有任何方法來隱藏兩個實現在一個cpp文件,並使用它在另一個cpp文件使用這種前瞻性聲明?問題來自於創建API,我想隱藏某些類的實現。
確定你可以,但是你正在通過試圖查看它來侵犯'main'中隱藏的'Two''(沒有'Two'成員或方法的訪問權限,而沒有包含'Two ')。 – crashmstr
謝謝大家的回答,關於析構函數的評論也很有幫助。所以我現在的理解是,使用這種前向聲明來隱藏實現和類定義,就像在pimpl習語中一樣,如果我們在一個定義發生的翻譯單元中提到了forward聲明的類,那麼它就是有意義的,否則我將不得不引入class在每個地方定義它的方法/字段(因此不會進行類定義隱藏)。所以我認爲我的設計決定是不正確的...... – user3655463
_「我認爲我的設計決定是不正確的」_我不確定我是否理解你是如何得出這個結論的。你也可以在頭文件中隱藏實現。看我下面的例子。 – ZDF