不允许直接在同一个类中访问成员变量

时间:2015-11-05 09:21:10

标签: c++ oop

我不确定我的问题是对还是不对?但是我还是试着问一次。

我有一个定义了很少成员变量的类。根据OO概念,每个成员函数都可以访问其类的所有成员变量。

但我希望通过特定方法(即Getters)访问这些成员变量,即使在相同的类成员函数中也是如此。

有什么办法吗?

class A {

public:

void func1();
void func2();
B getB();

private:
B b;
}

void A::func1() {

b.functionFromB(); // function uses member variable b directly
}

void A::func2() {
B b1=getB();  // function ask for B from a function and then uses it. // I need something like this... And ensure each function uses same way otherwise there should be warning...
b1.functionFromB();
}

谢谢, 凯拉斯

3 个答案:

答案 0 :(得分:2)

不,没有。你可以通过封装和继承来实现,如:

class shape
{
    private:
        int angles;
    protected:
        shape(int angles_):angles(angles_){}; 
        int getAngles() const;
}

class square : private shape
{
    public:
        square():shape(4){}
        void doSth()
        {
            \\ you can access angles only via getAngles();
        }    
}

答案 1 :(得分:1)

可以从类中访问类的任何私有成员,但不能由类的用户访问。所以看起来你需要私有成员和公共方法来允许访问它们。

class A
{
  private:
      int a;
  public:
      int getA() {return a;}

};

int main()
{
  A inst;
  int t;

  inst.a =5; // error member a is private
  t = inst.getA(); //OK
}

如果您只想允许从另一个类创建类的实例,那么概念可以很好地扩展到嵌套类声明;详情here

答案 2 :(得分:0)

正如其他人所说 - 你必须增加一层。

如果您想要授予特定方法的访问权限,则可以使用friend关键字。 E.g。

// Public.h
#pragma once

class Public
{
public:
    Public();

    int GetI() const;
    float GetF() const;

private:
    std::unique_ptr<Private> p_;
};

//Public.cpp
#include "Public.h"

Public::Public()
    : p_(new Private)
{
}

int Public::GetI() const
{
    return p_->i_;
}

float Public::GetF() const
{
    return p_->f_;
}

// Private.h
#pragma once

class Private
{
    friend int Public::GetI() const;
    friend float Public::GetF() const;

    int i_;
    float f_;
};

请记住,每个朋友方法都可以访问所有私人成员。

如果你真的想限制哪些方法可以访问哪些成员那么你可以将每个成员包装在一个单独的类/结构中,并且只使该成员的getter / setter成为该类/结构的朋友,但我不建议这种方法。