是否有帮助使用私有结构的功能

时间:2019-04-11 13:20:21

标签: c++ struct private

我需要一个可以输入私有结构的函数

    #include <iostream>
    using namespace std;

    struct abc {
    private:
        int a;
    }b;

    int main(){
        //i want to use the variable a
        system("pause");
    }

3 个答案:

答案 0 :(得分:4)

这将破坏封装。

如果您需要读取变量a,请创建一个吸气剂:

struct abc {
int getA() const;
private:
    int a;
};

如果需要修改变量,则应创建一个setter:

struct abc {
void setA(int);
private:
    int a;
};

有一种使用friend function的方法,但我不建议您这样做。

如果它是struct,请在需要访问且无需封装的情况下考虑将a公开。

答案 1 :(得分:1)

如果要允许特定的类/结构或函数访问私有成员,请使用friend声明。通常,这仅用于紧密相关的事物,以使其他成员无法访问成员(在其他语言中,类似internal之类的事物。)

struct abc {
private:
    int a;
    friend int main();
};

void foo(abc &x) {
    x.a = 5; // ERROR
}
int main(){
    abc x;
    x.a = 2; // OK
    foo(x);
    //i want to use the variable a
    system("pause");
}

通常,如果您要进行只读访问,将使用“ getter”,例如

struct abc {
    int get_a()const { return a; }
private:
    int a = 45;
};

int main() {
    abc x;
    std::cout << x.get_a(); // OK
}

以读写方式获取和设置功能。 set函数可以执行额外的验证或其他逻辑。

struct abc {
    int get_a()const { return a; }
    void set_a(int x)
    {
        if (x % 2) throw std::invalid_argument("abc must be even");
        a = x;
    }
private:
    int a = 45;
};

int main() {
    abc x;
    x.set_a(50);
    std::cout << x.get_a();
    x.set_a(51); // throws
}

答案 2 :(得分:0)

除了声明它们的类之外,任何人都不应访问私有字段和方法。但是,在某些情况下需要使用它。例如,如果您要序列化/打印您的结构。对于这些情况,您可以使用friend关键字声明一个函数或另一个类。例如:

struct abc
{
private:
    friend std::ostream &operator<<(std::ostream &stream, const abc &s);

    int a;
};

然后,您将在某处实现具有相同签名std::ostream &operator<<(std::ostream &stream, const abc &s);的功能,并且可以访问abc::a

std::ostream &operator<<(std::ostream &stream, const abc &s)
{
    return stream << s.a;
}

这将允许您将结构与std::cout一起使用。

请注意,没有很多像这样的真实案例,您应尽可能避免使用friend。例如,在这种情况下,getter方法会做同样的事情,并且您可以避免整个问题而不会破坏封装。