0

我了解关于类方法/属性构造的公共、私有、受保护的继承差异。但是,我的问题与指向空终止字符串的指针特别相关。

class MyClass
{
   private: 
      char * SomeValue;

   ...
   ...
}

现在,在某个处理过程中,MyClass->SomeValue 被分配并填充了一个字符串值。没问题。现在,我想要一些调用源,它创建了我的“MyClass”对象的实例并需要其中的字符串值。由于 C++ 可以对指针和指向指针的指针等造成很多损害,我想将指针位置返回到分配的字符字符串,但不希望任何人更改值。这个默认值是否在编译器和内存管理内部控制?任何人将此类主要用于内部目的的风险很低,但这只是我的理解。

谢谢

4

8 回答 8

3

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

class MyClass {
  char* someValue;
public:
  const char* get_SafeSomeValue() const {
    return someValue;
  }
};
于 2010-11-22T15:42:08.980 回答
2

不,你真的不能那样做。

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

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

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

于 2010-11-22T15:46:01.330 回答
1

std::string当 C++提供了一种更简洁、更安全的包含和传输字符串的方法时,为什么还要使用裸指针来保存字符串?听起来你想要做的是获取字符串的值而不允许另一个类/函数/方法更改值?只需将其const作为修饰符返回:

const char* foo();
于 2010-11-22T15:43:28.150 回答
1

您可以使用:

private:
    const string someValue;
public:
    const string& getReadOnlyValue() { return someValue;};
于 2010-11-22T15:44:29.290 回答
0

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

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

在 WindowsAPI 中,VirtualAllocEx 是一个很好的入门...

于 2010-11-22T15:51:15.933 回答
0

你想做的事情是不可能的。c++ 没有提供防止人们用脚射击自己的机制。例如,您将如何防止某人对该指针调用 delete?

于 2010-11-22T15:47:37.917 回答
0

你可以这样做:

class MyClass
{
   public:
      const char * getValue(); // return a pointer to a const char that can't be modified
   private: 
      char * SomeValue;

   ...
   ...
}
于 2010-11-22T15:42:26.417 回答
0

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

class MyClass
{
  private:
    char * SomeValue;


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

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

  • 将您的复制构造函数和赋值运算符设为私有,而不是实现它们。
  • 重载它们以正常工作。
  • 派生自 boost::noncopyable。
于 2010-11-22T15:45:16.047 回答