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

C++保护类的私有字符*

  •  0
  • DRapp  · 技术社区  · 15 年前

    我了解公共继承、私有继承和受保护继承在类方法/属性结构方面的区别。但是,我的问题与指向以空结尾的字符串的指针特别相关。。

    class MyClass
    {
       private: 
          char * SomeValue;
    
       ...
       ...
    }
    

    现在,在处理的某个地方,MyClass->SomeValue被分配并填充一个字符串值。没问题。现在,我想要一些调用源,它创建了我的“MyClass”对象的一个实例,并需要从中获取字符串值。因为C++可以用指针和指针等来做很多损坏,所以我想把指针位置返回到分配的字符串,但是不希望任何人改变值。这个默认值是在编译器和内存管理中控制的吗?这是一个低风险,任何人都会使用这个类作为它的主要内部目的,但只是我的理解更多。

    谢谢

    8 回复  |  直到 15 年前
        1
  •  3
  •   Chris Becke    15 年前

    通常,您会返回一个指向字符的常量指针。没有什么可以阻止某人将返回值强制转换为非常量。但是C++并不是为了防御恶意编码而设计的。

    class MyClass {
      char* someValue;
    public:
      const char* get_SafeSomeValue() const {
        return someValue;
      }
    };
    
        2
  •  2
  •   Matthieu M.    15 年前

    不,你不能这么做。

    即使你做了别人建议的事情,例如:

    class MyClass {
        char* someValue;
    public:
        const char* get_SafeSomeValue() const {
            return someValue;
        }
    };
    

    你仍然可以调用 delete myClassInstance->get_SafeSomeValue() .

        3
  •  1
  •   wheaties    15 年前

    为什么在C++中使用裸指针保存字符串? std::string 提供了一种更清洁、更安全的方法来容纳和运输绳子?听起来,您想做的是在不允许其他类/函数/方法更改值的情况下获取字符串的值?把它还给我 const 作为修饰语:

    const char* foo();
    
        4
  •  1
  •   shuvalov    15 年前

    您可以使用:

    private:
        const string someValue;
    public:
        const string& getReadOnlyValue() { return someValue;};
    
        5
  •  0
  •   Stephane Rolland    15 年前

    你可以这样做:

    class MyClass
    {
       public:
          const char * getValue(); // return a pointer to a const char that can't be modified
       private: 
          char * SomeValue;
    
       ...
       ...
    }
    
        6
  •  0
  •   CashCow    15 年前

    如果用户不更改他们指向的数据,则可以使用返回const char*的函数。

    class MyClass
    {
      private:
        char * SomeValue;
    
    
      public:
        const char * getSomeValue() const
        {
           return SomeValue;
        }
    };
    

    您需要小心类中的对象被复制和分配。出于实际目的,您可能需要将char*替换为std::string或std::vector<char>。如果失败,您可以:

    • 将复制构造函数和赋值运算符设为私有,而不是实现它们。
    • 使它们超载以正常工作。
    • 从boost派生::不可操作。
        7
  •  0
  •   BЈовић    15 年前

    你想做什么是不可能的。c++没有提供任何机制来防止人们开枪打自己的脚。例如,如何防止有人对该指针调用delete?

        8
  •  0
  •   Roman Pfneudl    15 年前

    这是可能的-它只是操作系统依赖于实现。

    这些事情是通过受保护的内存页来处理的—您可以分配几个内存页并将它们设置为“只读”—然后每个写访问都将失败,并出现异常。它只需要一点程序开销。

    在WindowsAPI中,VirtualAllocEx是一个很好的启动程序。。。