我的場景在以下示例中被簡化了:無障礙C++向量的從基類
#include <iostream>
#include <vector>
using namespace std;
class C;
class A
{
protected:
C * cPointer;
A();
virtual void updateList() = 0;
void callFunc();
};
class B : public A
{
private:
vector<int> list;
void updateList();
public:
void callFromA();
};
class C
{
friend class A;
friend class B; // I want to get rid off this declaration
private:
int sum;
void set_sum(int val);
public:
static C * getCPointer();
};
A::A()
{
cPointer = C::getCPointer();
}
void A::callFunc()
{
updateList();
}
void B::updateList()
{
list.push_back(2);
list.push_back(4);
int s = 0;
for(unsigned int i=0; i<list.size(); i++)
{
s += list[i];
}
cPointer->set_sum(s);
}
void B::callFromA()
{
callFunc();
}
void C::set_sum(int val)
{
sum = val;
cout << "Sum at C is: " << sum << endl;
}
C * C::getCPointer()
{
static C cPointer;
return & cPointer;
}
int main(int argc, char ** argv)
{
B b;
b.callFromA();
return 0;
}
此示例工作正常。但是我想擺脫C類中的「朋友類B」聲明並實現類似的功能。其實我想有以下任一操作:
的C)從B :: updateList()無障礙:: set_sum(無類C.
的「朋友B類」的聲明,這將是不可能的A :: callFunc()中的B :: list的可訪問性,我可以將B :: updateList中的邏輯推送到A :: callFunc(),這基本上意味着能夠從基類訪問派生類中的列表類。通過這種方式,我將能夠訪問A :: callFunc()的set_sum()由於C類
任何想法,「朋友A級」的聲明來實現這個不涉及重大設計變更是可取的!
謝謝!
你是從'B :: callFromA()'調用全局函數'callFunc()'嗎?它在哪裏? –
這裏的問題可能是你將有許多基類'A'的派生類,並且你不想列出所有這些類作爲'C'的朋友。爲了解決這個問題,你可以只讓基類'A'成爲'C'的朋友,並且你可以將一個受保護的'set_sum()'方法放入'A'中,所有派生類都可以調用'A' :: set_sum'確實將呼叫轉發到'C :: set_sum'。這個轉發函數調用將被編譯器優化掉。 – pasztorpisti
@barakmanos:callFunc()在A中作用域,並從B :: callFromA()中調用,因爲B是從A派生而來的。 –