gpt4 book ai didi

C++:如何使一组派生类能够访问一个类的私有(private)成员?

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

假设一个类:图书馆

并且我们有一组从基类LibraryCustomer派生的类,比如: child ,家长,学生,等等

在Library类中,有一组(大量的)私有(private)成员变量。由于 Library 类中有大量私有(private)成员,我不想使用繁琐的 getter 和 setter。此外,LibraryCustomer 派生类通常会引用这些成员。 Getter 和 Setter 不方便。

为了让那些 LibraryCustomers 访问 Library 中的那些私有(private)成员,我需要将这些 LibraryCustomers 声明为 Library 中的友元类。

但是由于派生类不断增长,我不想将它们一一添加到类库中。

在 Library 中添加基类 LibraryCustomer 作为友元似乎不起作用。那么还有什么更好的方法呢?

[更新] 我想访问 Library 类中的大量私有(private)成员变量。由于有很多,所以我不想使用getter和setter。希望LibraryCustomer的派生类可以自由访问Library类中的那些私有(private)成员变量。

最佳答案

LibraryCustomer 中提供一个函数,该函数访问 Library 以获取数据并将该数据提供给从 LibraryCustomer 派生的类。

class Library
{
friend class LibraryCustomer;

private:

std::string name;
};

class LibraryCustomer
{
protected:

std::string getLibraryName(Library const& lib)
{
return lib.name;
}
};

class Kid : public LibraryCustomer
{
// Can use LibraryCustomer::getLibraryName() any where
// it needs to.
};

话虽如此,从 Library 本身提供对数据的访问会更容易。

class Library
{
public:

std::string getName() const { return name; }

private:

std::string name;
};

那么,就不需要 friend 声明和包装函数 LibraryCustomer::getLibraryName()

编辑

@MooingDuck 有有趣的建议。如果您必须公开许多此类变量,最好将它们全部放在一个类中。工作代码在 http://coliru.stacked-crooked.com/a/2d647c3d290604e9 .

#include <iostream>
#include <string>

class LibraryInterface {
public:
std::string name;
std::string name1;
std::string name2;
std::string name3;
std::string name4;
std::string name5;
std::string name6;
};

class Library : private LibraryInterface
{
public:
Library() {name="BOB";}
private:
LibraryInterface* getLibraryInterface() {return this;} //only LibraryCustomer can aquire the interface pointer
friend class LibraryCustomer;
};

class LibraryCustomer
{
protected:
LibraryInterface* getLibraryInterface(Library& lib) {return lib.getLibraryInterface();} //only things deriving from LibraryCustomer can aquire the interface pointer
};

class Kid : public LibraryCustomer
{
public:
void function(Library& lib) {
LibraryInterface* interface = getLibraryInterface(lib);
std::cout << interface->name;
}
};

int main() {
Library lib;
Kid k;
k.function(lib);
}

关于C++:如何使一组派生类能够访问一个类的私有(private)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30087274/

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