簡體   English   中英

如何授予朋友class訪問修改成員的值

[英]How to grant friend class access to value of modified member

授予 class 訪問不同 class 的私有成員的修改值的正確方法是什么。

使用 Friend Class 允許我訪問私有成員的值(如果提供)但不允許我訪問該成員的修改后的值數據。

例如,當我在一個 Class 中構建向量時,我想在另一個 class 中構建該向量的數據。

如何授予訪問權限

bar_start.Print()

具有相同的值

foo_start.PrintData()

我相信它仍在 memory 中並且沒有被刪除

class Foo
{
public:
    Foo();
    ~Foo();
    void ChangeData();
    void PrintData();

private:
    int k = 0;
    std::vector<int> m_vector;
    friend class Bar;
};

class Bar
{
public:
    Bar();
    ~Bar();
    void Print();
};

void Foo::ChangeData()
{
    m_vector.push_back(1);
    int k = 5;
}

void Foo::PrintData()
{
    std::cout << k << std::endl;
    std::cout << m_vector[0] << std::endl;
}

void Bar::Print()
{
    Foo obj;
    std::cout << obj.k << std::endl;
    std::cout << obj.m_vector[0] << std::endl;
}

// printing in main() function

Foo foo_start;
Bar bar_start;

foo_start.ChangeData();
foo_start.PrintData(); // k = 5, m_vector[0] = 1;

bar_start.Print(); // k = 0, m_vector[0] empty and error due not existing element in vector

看來你的意思如下

void Bar::Print( Foo &obj )
{
    std::cout << obj.k << std::endl;
    std::cout << obj.m_vector[0] << std::endl;
}

並像這樣調用方法

bar_start.Print( foo_start );

要不就

void Bar::Print( Foo &obj )
{
    obj.PrintData()
}

並像這樣調用方法

bar_start.Print( foo_start );

那就是你需要通過引用傳遞給成員 function 打印一個 Foo 類型的 object。

要使用最后顯示的 function 定義,無需將 class Bar 聲明為 class Foo 的友元,因為成員 function PrintData是公共成員 function。

您可能希望在每個Bar實例中存儲指向特定Foo的引用/指針。

class Bar {
public:
    Bar(Foo& f) : foo(&f) {} // take a Foo by reference and store a pointer to it

    void Print();

private:
    Foo* foo;
};

void Bar::Print() { // use the pointer to the Foo in here:
    std::cout << foo->k << std::endl;
    std::cout << foo->m_vector[0] << std::endl;
}

然后您需要創建每個Bar提供您希望它連接到的Foo實例可以這么說:

int main() {
    Foo foo_start;
    Bar bar_start(foo_start); // this Bar now stores a pointer to foo_start

    foo_start.ChangeData();
    bar_start.Print();
}

另請注意,您在ChangeData中實例化的k不是成員變量k 你用5初始化一個名為k的新變量,然后k被遺忘了。

void Foo::ChangeData()
{
    m_vector.push_back(1);
    int k = 5;
}

如果要更改成員變量k ,請刪除聲明部分並為其分配5

void Foo::ChangeData()
{
    m_vector.push_back(1);
    k = 5;
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM