代码之家  ›  专栏  ›  技术社区  ›  slashmais

C++引用类的私有变量编译器问题?

  •  1
  • slashmais  · 技术社区  · 14 年前

    例子:

    //-------------------------------------------
    class Others
    {
    public:
     Others() {};
     void ChangeIt(string &str) { str = "Changed by Others"; }
    };
    
    //-------------------------------------------
    class Locals
    {
    private:
     string PrivateString;
    public:
     Locals() { PrivateString = "Set by Locals"; };
     void VisitOthers() { Others o; o.ChangeIt(PrivateString); }
     const string GetString() { return PrivateString; }
    };
    
    //-------------------------------------------
    int main(void)
    {
     Locals lo;
     cout << lo.GetString() << "\n";
     lo.VisitOthers();
     cout << lo.GetString() << "\n";
     return 0;
    }
    

    输出:

    Set by Locals
    Changed by Others
    

    我需要使用其他/不同的对象来执行类似的操作,这些对象对owner类是私有的,但在需要时可以由其他对象更改。我最不希望这种做法在将来再次出现。

    本质上让我担心的是,我想把类/结构基本上看作指向缓冲区的指针,把成员的地址看作这个缓冲区的偏移量,这样即使传递成员的指针值,如果没有它所属的类/结构的基指针,它也没用。这是我本能的感觉应该是这样的,所以上面的例子甚至不应该是可能的。

    4 回复  |  直到 14 年前
        1
  •  5
  •   Nikola Smiljanić    14 年前

    没有什么可以阻止的,你通过引用传递你的私人成员。您正在调用的函数没有访问您的私有成员,它正在更改自己的参数(恰好是某个类的成员)。代码还可以,但重要的是您调用的函数没有保留对私有成员的引用。

        2
  •  2
  •   Chubsdad    14 年前

    编辑2:

    变异版本的 operator[] 对于类,还通常为外部实体提供修改私有成员的接口。

        3
  •  1
  •   bjskishore123    14 年前

    如果希望其他对象修改对象,请转到

    友元类和友元函数

        4
  •  1
  •   Haplo    14 年前

    通过私人会员完全可以。您可以通过将VisitOthers()设为const方法来指示它不会更改您的对象。如果方法是:

    void VisitOthers() const {Other o; o.visit(PrivateString);}