当前位置: 首页 > 知识库问答 >
问题:

C当成员值从指针更改为非指针时出现const问题

卫华奥
2023-03-14

我有两个类TestClass另类,其中TestClass有一个名为m_otherClass另类类型的成员变量。请注意,这没有声明为const。

在下面提供的最小示例中;当m_otherClass是指针时,那么一切都会编译并运行良好。如果我将其更改为非指针,那么我会得到编译器错误(这些更改在最小示例中被注释掉):

“对常量对象调用了非常量函数“setOtherMember”

错误:通过'const其他类'作为'this'参数丢弃限定符[-fpermissive]m_otherClass.set其他成员();

#include <iostream>
#include <memory>

class OtherClass {
public:
    void setOtherMember() {
        m_otherMember = 2;
        std::cout << "Other member is now 2" << std::endl;
    }

private:
    int m_otherMember = 0;
};


class TestClass {
public:
    TestClass(): m_otherClass(std::make_unique<OtherClass>())
//  TestClass()
    {}

    void myMethod() const {
        m_otherClass->setOtherMember();
//      m_otherClass.setOtherMember();
    }
private:
        std::unique_ptr<OtherClass> m_otherClass;
//      OtherClass m_otherClass; // If changing to this I get the error!!
};


int main() {
    TestClass testClass;
    testClass.myMethod();
    return 0;
}

这是因为myMethod()是const(然后promise不更改任何成员变量),而set的成员()是非const和正在更改其他类的成员变量,然后间接地也是m_otherClass对象?

但是,当m\u otherClass是指针时,为什么这不会失败呢?当m\u OtherClass未声明为const时,为什么编译器错误会说将“const OtherClass”作为“this”参数传递失败?

共有3个答案

郤仰岳
2023-03-14

在方法上设置常量时,所有数据成员都被视为常量。这就是为什么当使用OtherClass作为值时会出现错误,因为它变成了const OtherClass的值。

现在,当您使用另一类指针时,您会得到const std::unique\u ptr

轩辕经赋
2023-03-14

一个更简单的示例来演示这种差异。

struct Foo { int m; };

const Foo f = {10}; 
f.m = 20; // Not allowed since modifying f.m modifies f.

struct Bar { int* p; };
int i = 10;
int j = 20;

const Bar b = {&i};

b.p = &j;    // Not allowed since modifying b.p modifies b.

*(b.p) = j;  // Allowed since it does not change b or b.p. It changes the value
             // of what b.p points to.
虞唯
2023-03-14

在大多数情况下,const限定成员函数不允许更改对象的成员状态。这意味着,每个不可变的成员都不能在该函数体中修改。在处理指针时,您只是说,您不会修改指针值,而不是指针本身。这是因为指针的恒定性不会在其指针上传播。

在即将到来的标准中,可以通过使用propagate_const来改变这种行为。

 类似资料:
  • 假设有一个结构 我得到一个指向该结构的成员的指针,比如作为某个函数的参数: 如何获取指向包含对象的指针?最重要的是:在不违反标准中的某些规则的情况下,也就是说,我想要标准定义的行为,而不是未定义或实现定义的行为。 附带说明:我知道这规避了类型安全。

  • 指针不是存放首地址吗,怎么不一样呢

  • 学习 C++ 的指针既简单又有趣。通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的。 正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:#include <iostr

  • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p

  • FAQs in section [33]: [33.1] “成员函数指针”类型不同于“函数指针”吗? [33.2] 如何将一个成员函数指针传递到信号处理函数,X事件回调函数,系统调用来启动一个线程/任务等? [33.3] 为什么我总是收到编译错误(类型不匹配)当我尝试用一个成员函数作为中断服务例程? when I try to use a member function as an interru

  • 概念 在我们了解了指针的基本概念之后,接下来我们来看一下指针和C中给我们提供的关键字中的类型修饰符它们之间的关系。指针就是存储地址的一种特殊变量。那这个变量跟我们的修饰符之间还有哪些更深层次的符号限制呐?我们在实际开发过程中,经常会运用修饰符,把指针的这种限制范围更明确的告诉给用户,通过不同修饰符告诉给用户指针的具体属性。 指针变量也是一个变量,它可以改变存储的地址,指向一个地方再指向另外一个地方